Theolizer  Version.1.2.0
serializer for C++ / Do you want to update your classes easily ?
serializer_json.h
[詳解]
1 //############################################################################
2 /*!
3  @brief Jsonシリアライザ
4  @ingroup TheolizerLib
5  @file serializer_json.h
6  @author Yoshinori Tahara
7  @date 2015/09/18 Created
8 */
9 /*
10  © 2016 Theoride Technology (http://theolizer.com/) All Rights Reserved.
11  "Theolizer" is a registered trademark of Theoride Technology.
12 
13  "Theolizer" License
14  In the case where you are in possession of a valid “Theolizer” License,
15  you may use this file in accordance with the terms and conditions of
16  the use license determined by Theoride Technology.
17 
18  General Public License Version 3 ("GPLv3")
19  You may use this file in accordance with the terms and conditions of
20  GPLv3 published by Free Software Foundation.
21  Please confirm the contents of GPLv3 at https://www.gnu.org/licenses/gpl.txt .
22  A copy of GPLv3 is also saved in a LICENSE.TXT file.
23 
24  商用ライセンス
25  あなたが有効なTheolizer商用ライセンスを保持している場合、
26  セオライド テクノロジーの定める使用許諾書の条件に従って、
27  このファイルを取り扱うことができます。
28 
29  General Public License Version 3(以下GPLv3)
30  Free Software Foundationが公表するGPLv3の使用条件に従って、
31  あなたはこのファイルを取り扱うことができます。
32  GPLv3の内容を https://www.gnu.org/licenses/gpl.txt にて確認して下さい。
33  またGPLv3のコピーをLICENSE.TXTファイルにおいてます。
34 */
35 //############################################################################
36 
37 #if !defined(THEOLIZER_INTERNAL_SERIALIZER_JSON_H)
38 #define THEOLIZER_INTERNAL_SERIALIZER_JSON_H
39 
40 #include "serializer.h"
41 
42 //############################################################################
43 // Begin
44 //############################################################################
45 
46 // ***************************************************************************
47 // DLL用の警告禁止
48 // ***************************************************************************
49 
50 #ifdef _MSC_VER
51  #pragma warning(push)
52  #pragma warning(disable:4251 4702)
53 #endif
54 
55 namespace theolizer
56 {
57 
58 //############################################################################
59 // 共通定義
60 //############################################################################
61 
62 // ***************************************************************************
63 // Jsonシリアライザのバージョン番号とシリアライザ名
64 // 注意事項:
65 // このバージョンはサイズに「幅」がない。(厳密に一致することが必要)
66 // 余裕を持たせる場合、下記工夫が必要
67 // シリアライズ時は実型を表現できるシリアライズ型へ
68 // デシリアライズ時はシリアライズ型を表現できる実型へ
69 // そこそこ手間が掛かりそうななので、必要が生じたら対応を検討する
70 // ***************************************************************************
71 
72 namespace internal
73 {
74 #ifndef THEOLIZER_INTERNAL_DOXYGEN
75 
76 const static char kJsonSerializerName[]="JsonTheolizer";
77 const static unsigned kJsonSerializerVersionNo=1;
78 
79 // ***************************************************************************
80 // プロバティ返却
81 // 必要な場合直接見えた方が良いのでここで定義
82 // ***************************************************************************
83 
84 inline bool hasPropertyJson(Property iProperty, bool iIsSaver)
85 {
86  bool ret=false;
87  switch(iProperty)
88  {
89  case Property::IsSaver:
90  ret=iIsSaver;
91  break;
92 
93  case Property::EncodedString:
94  ret=true;
95  break;
96 
97  case Property::SupportModifying:
98  ret=true;
99  break;
100 
101  case Property::BinaryOpen:
102  ret=false;
103  break;
104  }
105 
106  return ret;
107 }
108 
109 // ***************************************************************************
110 // プリミティブ(組み込み型)名生成
111 // ***************************************************************************
112 
113 class JsonMidOSerializer;
114 class JsonMidISerializer;
115 
116 #define THEOLIZER_INTERNAL_INTEGRAL(dSigned, dDigits, dName1) \
117  template<class tMidSerializer, typename tPrimitive> \
118  struct PrimitiveName \
119  < \
120  tMidSerializer, \
121  tPrimitive, \
122  EnableIf \
123  < \
124  (std::is_same<tMidSerializer, JsonMidOSerializer>::value \
125  || std::is_same<tMidSerializer, JsonMidISerializer>::value) \
126  && (std::numeric_limits<tPrimitive>::is_signed == dSigned) \
127  && (std::numeric_limits<tPrimitive>::radix == 2) \
128  && (std::numeric_limits<tPrimitive>::digits == dDigits) \
129  && (std::numeric_limits<tPrimitive>::max_exponent == 0) \
130  > \
131  > \
132  { \
133  static char const* getPrimitiveName(unsigned iSerializerVersionNo) \
134  { \
135  switch(iSerializerVersionNo) \
136  { \
137  case 1: return dName1; \
138  } \
139  THEOLIZER_INTERNAL_ABORT("getPrimitiveName() : iVersionNo is illegal.");\
140  return ""; \
141  } \
142  }
143 
144 #define THEOLIZER_INTERNAL_FLOAT(dDigits, dMaxExponent, dName1) \
145  template<class tMidSerializer, typename tPrimitive> \
146  struct PrimitiveName \
147  < \
148  tMidSerializer, \
149  tPrimitive, \
150  EnableIf \
151  < \
152  (std::is_same<tMidSerializer, JsonMidOSerializer>::value \
153  || std::is_same<tMidSerializer, JsonMidISerializer>::value) \
154  && (std::numeric_limits<tPrimitive>::is_signed == 1) \
155  && (std::numeric_limits<tPrimitive>::radix == 2) \
156  && (std::numeric_limits<tPrimitive>::digits == dDigits) \
157  && (std::numeric_limits<tPrimitive>::max_exponent == dMaxExponent)\
158  > \
159  > \
160  { \
161  static char const* getPrimitiveName(unsigned iSerializerVersionNo) \
162  { \
163  switch(iSerializerVersionNo) \
164  { \
165  case 1: return dName1; \
166  } \
167  THEOLIZER_INTERNAL_ABORT("getPrimitiveName() : iVersionNo is illegal.");\
168  return ""; \
169  } \
170  }
171 
172 #define THEOLIZER_INTERNAL_STRING(dBytes, dName1) \
173  template<class tMidSerializer, typename tPrimitive> \
174  struct PrimitiveName \
175  < \
176  tMidSerializer, \
177  tPrimitive, \
178  EnableIf \
179  < \
180  (std::is_same<tMidSerializer, JsonMidOSerializer>::value \
181  || std::is_same<tMidSerializer, JsonMidISerializer>::value) \
182  && (IsString<tPrimitive>::value) \
183  && (sizeof(typename tPrimitive::value_type) == dBytes) \
184  > \
185  > \
186  { \
187  static char const* getPrimitiveName(unsigned iSerializerVersionNo) \
188  { \
189  switch(iSerializerVersionNo) \
190  { \
191  case 1: return dName1; \
192  } \
193  THEOLIZER_INTERNAL_ABORT("getPrimitiveName() : iVersionNo is illegal.");\
194  return ""; \
195  } \
196  }
197 
198 THEOLIZER_INTERNAL_INTEGRAL(0, 1, "bool");
199 
200 THEOLIZER_INTERNAL_INTEGRAL(1, 7, "int8");
201 THEOLIZER_INTERNAL_INTEGRAL(1, 15, "int16");
202 THEOLIZER_INTERNAL_INTEGRAL(1, 31, "int32");
203 THEOLIZER_INTERNAL_INTEGRAL(1, 63, "int64");
204 
205 THEOLIZER_INTERNAL_INTEGRAL(0, 8, "unit8");
206 THEOLIZER_INTERNAL_INTEGRAL(0, 16, "uint16");
207 THEOLIZER_INTERNAL_INTEGRAL(0, 32, "uint32");
208 THEOLIZER_INTERNAL_INTEGRAL(0, 64, "uint64");
209 
210 THEOLIZER_INTERNAL_FLOAT(24, 128, "float32");
211 THEOLIZER_INTERNAL_FLOAT(53, 1024, "float64");
212 THEOLIZER_INTERNAL_FLOAT(64, 16384, "float80");
213 
214 THEOLIZER_INTERNAL_STRING(1, "string");
215 THEOLIZER_INTERNAL_STRING(2, "string");
216 THEOLIZER_INTERNAL_STRING(4, "string");
217 
218 #undef THEOLIZER_INTERNAL_INTEGRAL
219 #undef THEOLIZER_INTERNAL_FLOAT
220 #undef THEOLIZER_INTERNAL_STRING
221 
222 //----------------------------------------------------------------------------
223 // プリミティブ名からC++名へ変換
224 //----------------------------------------------------------------------------
225 
226 #ifdef THEOLIZER_INTERNAL_ENABLE_META_SERIALIZER
227 THEOLIZER_INTERNAL_DLL
228 char const* getCppNameJson(std::string const& iPrimitiveName, unsigned iSerializerVersionNo);
229 #endif // THEOLIZER_INTERNAL_ENABLE_META_SERIALIZER
230 
231 //############################################################################
232 // Json Serializer実装部
233 //
234 // 各文字列型が下記文字エンコードであるとして処理する
235 // std::string UTF-8
236 // std::wstring UTF-16/32
237 // std::u16string UTF-16
238 // std::u32string UTF-32
239 // ただし、mCharIsMultiByteがtrueの時、
240 // std::stringがMultiByteエンコードされているとして処理する。
241 //############################################################################
242 
243 #endif // THEOLIZER_INTERNAL_DOXYGEN
244 // ***************************************************************************
245 /*!
246 @brief 保存用中間JsonSerializer
247 @details 主な処理はここで行うが、インスタンスを作れないよう抽象クラスとする。
248 */
249 // ***************************************************************************
250 
251 class THEOLIZER_INTERNAL_DLL JsonMidOSerializer : public BaseSerializer
252 {
253 private:
254  friend class BaseSerializer;
255  THEOLIZER_INTERNAL_FRIENDS_FOR_INTERNAL;
256 
257 //----------------------------------------------------------------------------
258 // 基本
259 //----------------------------------------------------------------------------
260 
261  std::ostream& mOStream;
262  bool mNoPrettyPrint;
263  bool mWriteComma;
264 
265  static const unsigned kLastVersionNo=kJsonSerializerVersionNo;
266 
268  typedef JsonMidOSerializer MetaOSerializer; // メタ・シリアライザ
269  typedef JsonMidISerializer MetaISerializer; // メタ・デシリアライザ
270 
271 protected:
272  bool mCharIsMultiByte;
273  static char const* const kSerializerName;
274  static std::ios_base::openmode kOpenMode;
275 
277  (
278  std::ostream& iOStream,
279  Destinations const& iDestinations,
280  GlobalVersionNoTableBase const*const iGlobalVersionNoTable,
281  unsigned iGlobalVersionNo,
282  unsigned iLastGlobalVersionNo,
283  CheckMode iCheckMode,
284  bool iNoPrettyPrint,
285  bool iNoThrowException
286  );
287 
288 //----------------------------------------------------------------------------
289 // 型情報保存
290 //----------------------------------------------------------------------------
291 
292 private:
293 
294 // ---<<< ヘッダ保存 >>>---
295 
296  void writeHeader();
297 
298 //----------------------------------------------------------------------------
299 // データ保存
300 //----------------------------------------------------------------------------
301 
302 // ---<<< 制御情報保存 >>>---
303 
304  void saveControl(int iControl) {savePrimitive(iControl);}
305  void saveControl(long iControl) {savePrimitive(iControl);}
306  void saveControl(long long iControl) {savePrimitive(iControl);}
307  void saveControl(unsigned iControl) {savePrimitive(iControl);}
308  void saveControl(unsigned long iControl) {savePrimitive(iControl);}
309  void saveControl(unsigned long long iControl) {savePrimitive(iControl);}
310  void saveControl(std::string const& iControl) {encodeJsonString(iControl);}
311 
312 // ---<<< プリミティブ保存 >>>---
313 
314  #define THEOLIZER_INTERNAL_DEF_SAVE
315  #include "internal/primitive.inc"
316 
317 // ---<<< Element前処理 >>>---
318 
319  void writePreElement(bool iDoProcess=false);
320 
321 //----------------------------------------------------------------------------
322 // 内部処理
323 //----------------------------------------------------------------------------
324 
325 private:
326 
327 // ---<<< グループ処理 >>>---
328 
329  void saveGroupStart(bool iIsTop=false);
330  void saveGroupEnd(bool iIsTop=false);
331 
332 // ---<<< 各種構造処理 >>>---
333 
334  void saveStructureStart(Structure iStructure, std::string& ioTypeName, std::size_t iOjbectId);
335  void saveStructureEnd(Structure iStructure, std::string const& iTypeName);
336 
337 // ---<<< プリミティブ名返却 >>>---
338 
339  template<typename tType>
340  static char const* getPrimitiveName(unsigned iSerializerVersionNo)
341  {
342  static_assert(Ignore<tType>::kFalse, "Unknown primitive name.");
343  return "";
344  }
345 
346 // ---<<< Element名保存 >>>---
347 // 名前対応時のみ保存する
348 
349  void saveElementName(ElementsMapping iElementsMapping, char const* iElementName)
350  {
351  if (iElementsMapping == emName)
352  {
353  encodeJsonString(iElementName);
354  mOStream << ":";
355  }
356  }
357 
358 // ---<<< 整形処理 >>>---
359 
360  void writeCommaIndent(bool iWriteComma=false);
361 
362 // ---<<< JSON文字列へエンコードして保存 >>>---
363 
364  void encodeJsonString(std::string const& iString);
365 
366 // ---<<< プリミティブ名からC++型名返却 >>>---
367 
368 #ifdef THEOLIZER_INTERNAL_ENABLE_META_SERIALIZER
369  static char const* getCppName(std::string const& iPrimitiveName, unsigned iSerializerVersionNo)
370  {
371  return getCppNameJson(iPrimitiveName, iSerializerVersionNo);
372  }
373 #endif // THEOLIZER_INTERNAL_ENABLE_META_SERIALIZER
374 };
375 #ifndef THEOLIZER_INTERNAL_DOXYGEN
376 
377 //----------------------------------------------------------------------------
378 // プリミティブ名返却
379 //----------------------------------------------------------------------------
380 
381 #define THEOLIZER_INTERNAL_DEF_PRIMITIVE(dType, dSymbol) \
382  template<> \
383  inline char const* JsonMidOSerializer:: \
384  getPrimitiveName<dType>(unsigned iSerializerVersionNo) \
385  { \
386  return PrimitiveName<JsonMidOSerializer, dType>::getPrimitiveName(iSerializerVersionNo);\
387  }
388 #include "internal/primitive.inc"
389 
390 #endif // THEOLIZER_INTERNAL_DOXYGEN
391 // ***************************************************************************
392 /*!
393 @brief 回復用中間JsonSerializer
394 @details 主な処理はここで行うが、インスタンスを作れないよう抽象クラスとする。
395 */
396 // ***************************************************************************
397 
398 class THEOLIZER_INTERNAL_DLL JsonMidISerializer : public BaseSerializer
399 {
400 private:
401  friend class BaseSerializer;
402  THEOLIZER_INTERNAL_FRIENDS_FOR_INTERNAL;
403 
404 //----------------------------------------------------------------------------
405 // 基本
406 //----------------------------------------------------------------------------
407 
408  std::istream& mIStream;
409  bool mReadComma;
410  bool mTerminated;
411 
412  static const unsigned kLastVersionNo=kJsonSerializerVersionNo;
413 
415  typedef JsonMidOSerializer MetaOSerializer; // メタ・シリアライザ
416  typedef JsonMidISerializer MetaISerializer; // メタ・デシリアライザ
417 
418 protected:
419  bool mCharIsMultiByte;
420  static char const* const kSerializerName;
421  static std::ios_base::openmode kOpenMode;
422 
424  (
425  std::istream& iIStream,
426  Destinations const& iDestinations,
427  GlobalVersionNoTableBase const*const iGlobalVersionNoTable,
428  unsigned iLastGlobalVersionNo,
429  std::ostream* iOStream,
430  bool iNoThrowException
431  );
432 
433 //----------------------------------------------------------------------------
434 // ヘッダ回復と型チェック
435 //----------------------------------------------------------------------------
436 
437 private:
438 
439 // ---<<< ヘッダ情報回復 >>>---
440 
441  void readHeader();
442 
443 // ---<<< TypeIndex一致判定 >>>---
444 
445  bool isMatchTypeIndex(size_t iSerializedTypeIndex,
446  size_t iProgramTypeIndex);
447 
448 //----------------------------------------------------------------------------
449 // データ回復
450 //----------------------------------------------------------------------------
451 
452 private:
453 
454 // ---<<< 制御情報回復 >>>---
455 
456  void loadControl(int& oControl) {loadPrimitive(oControl);}
457  void loadControl(long& oControl) {loadPrimitive(oControl);}
458  void loadControl(long long& oControl) {loadPrimitive(oControl);}
459  void loadControl(unsigned& oControl) {loadPrimitive(oControl);}
460  void loadControl(unsigned long& oControl) {loadPrimitive(oControl);}
461  void loadControl(unsigned long long& oControl) {loadPrimitive(oControl);}
462  void loadControl(std::string& oControl) {decodeJsonString(oControl);}
463 
464 // ---<<< プリミティブ回復 >>>---
465 
466  #define THEOLIZER_INTERNAL_DEF_LOAD
467  #include "internal/primitive.inc"
468 
469 // ---<<< Element前処理 >>>---
470 // 戻り値:
471 // 次がないなら、Terminated(mTerminated=true)
472 // 次があるなら、Continue (mTerminated=false)
473 // それ以外なら、例外
474 
475  ReadStat readPreElement(bool iDoProcess=false);
476 
477 // ---<<< 要素破棄処理 >>>---
478 
479  void disposeElement();
480 
481 //----------------------------------------------------------------------------
482 // 内部処理
483 //----------------------------------------------------------------------------
484 
485 private:
486 
487 // ---<<< グループ処理 >>>---
488 // loadGroupEnd()呼び出し以前に、readPreElement()呼び出しにより、
489 // mTerminatedをtrueにしておくこと。
490 
491  void loadGroupStart(bool iIsTop=false);
492  void loadGroupEnd(bool iIsTop=false);
493 
494 // ---<<< 各種構造処理 >>>---
495 
496  void loadStructureStart(Structure iStructure, std::string& ioTypeName, std::size_t* oObjectId);
497  void loadStructureEnd(Structure iStructure, std::string const& iTypeName);
498 
499 // ---<<< プリミティブ名返却 >>>---
500 
501  template<typename tType>
502  static char const* getPrimitiveName(unsigned iSerializerVersionNo)
503  {
504  static_assert(Ignore<tType>::kFalse, "Unknown primitive name.");
505  return "";
506  }
507 
508 // ---<<< Element名回復 >>>---
509 // ヘッダが有る時はElementsMappingの値に関係なく名前対応可能である。
510 // そのような派生Serializerに対応するためのI/Fである。
511 // なお、JsonMid?Serializerはこの機能に対応していない。
512 // ヘッダはデバッグ用オプションなので、ヘッダの有無で動作を変えないため。
513 // 戻り値:
514 // 名前対応するなら、名前返却
515 // 順序対応するなら、empty返却
516 // 注意事項:
517 // 同じTheolizerVersion<>に対しては名前対応と順序対応を変えてはいけない
518 
519  std::string loadElementName(ElementsMapping iElementsMapping);
520 
521 // ---<<< ,まで読み飛ばし >>>---
522 // 戻り値:
523 // ,なら、true
524 // 終端なら、false
525 // それ以外なら、例外
526 
527  bool readComma(bool iReadComma=false);
528 
529 // ---<<< 終了マーク確認 >>>---
530 // 終了マークなら、true
531 
532  bool checkTerminal(char iIn);
533 
534 // ---<<< JSON文字列をデコードして文字列回復 >>>---
535 
536  void decodeJsonString(std::string& iString);
537 
538 // ---<<< 1文字読み出し >>>---
539 
540  char getChar();
541 
542 // ---<<< 指定以外の文字まで読み飛ばし >>>---
543 // 指定文字列に含まれない文字が出て来るまで、ストリームから読み捨てる。
544 // 戻り値は最後に読み出した文字
545 
546  char find_not_of(std::string const& iSkipChars);
547 
548 // ---<<< プリミティブ名からC++型名返却 >>>---
549 
550 #ifdef THEOLIZER_INTERNAL_ENABLE_META_SERIALIZER
551  static char const* getCppName(std::string const& iPrimitiveName, unsigned iSerializerVersionNo)
552  {
553  return getCppNameJson(iPrimitiveName, iSerializerVersionNo);
554  }
555 #endif // THEOLIZER_INTERNAL_ENABLE_META_SERIALIZER
556 };
557 #ifndef THEOLIZER_INTERNAL_DOXYGEN
558 
559 //----------------------------------------------------------------------------
560 // プリミティブ名返却
561 //----------------------------------------------------------------------------
562 
563 #define THEOLIZER_INTERNAL_DEF_PRIMITIVE(dType, dSymbol) \
564  template<> \
565  inline char const* JsonMidISerializer:: \
566  getPrimitiveName<dType>(unsigned iSerializerVersionNo) \
567  { \
568  return PrimitiveName<JsonMidISerializer, dType>::getPrimitiveName(iSerializerVersionNo);\
569  }
570 #include "internal/primitive.inc"
571 
572 #endif // THEOLIZER_INTERNAL_DOXYGEN
573 } // namespace internal
574 
575 //############################################################################
576 // Json Serializer I/Fクラス
577 // 保存先をテンプレートで指定する。
578 //
579 // 注意事項:
580 // JsonBaseI/OSerializerから派生してテンプレート化している。
581 // JsonBaseI/OSerializerを直接保存先のテンプレートとした場合、
582 // 使用した保存先全てに対して、コードが複製される。
583 // それを防ぐことが目的である。
584 //############################################################################
585 
586 // ***************************************************************************
587 //! 保存用JsonSerializer
588 // ***************************************************************************
589 
590 // ---<<< 通常用 >>>---
591 
592 template<Destination uDefault=theolizerD::All, Destination... uDestinations>
594 {
595  THEOLIZER_INTERNAL_FRIENDS;
596  void AbstructSerializer() { } // インスタンス生成許可
597 
598  static internal::Destinations const& getDestinations()
599  {
600  static const internal::Destinations destinations{uDefault, uDestinations...};
601  return destinations;
602  }
603 
604  // グローバル・バージョン番号テーブルへのポインタへのポインタ
605  // グローバル・バージョン番号テーブルへのポインタの値は初期化時、
606  // 確定していない可能性があるが、ポインタ自身のアドレスは確定している。
607  // なお、sGlobalVersionNoTableは外部リンケージを持たないものであり、
608  // Theolizerのクライアントをコンパイルする時に使われるsGlobalVersionNoTableを
609  // 取込む必要があるため、テンプレートであるトップ・シリアライザで処理する。
610  constexpr static internal::GlobalVersionNoTableBase const*const*const
611  kPtrGlobalVersionNoTable=&internal::sGlobalVersionNoTable;
612 
615 
616  // Switcherアクセス用
617  using MidSerializer::kSerializerName;
618  using BaseSerializer::mIsSaver;
619 
620 public:
621  //! ofstream用std::ios_base::openmode
622  using MidSerializer::kOpenMode;
623 
624 #ifndef THEOLIZER_INTERNAL_DOXYGEN
625  static const bool kHasDestination=true;
626 #endif // THEOLIZER_INTERNAL_DOXYGEN
627 
628  //! 通常のコンストラクタ
630  (
631  std::ostream& iOStream,
632  unsigned iGlobalVersionNo=kLastGlobalVersionNo,
634  bool iNoPrettyPrint=false,
635  bool iNoThrowException=false
636  ) : JsonMidOSerializer
637  (
638  iOStream,
639  getDestinations(),
640  internal::sGlobalVersionNoTable,
641  iGlobalVersionNo,
642  kLastGlobalVersionNo,
643  iCheckMode,
644  iNoPrettyPrint,
645  iNoThrowException
646  )
647  { }
648 
649  //! GlobalVersionNo以外のオプションを指定するコンストラクタ
651  (
652  std::ostream& iOStream,
653  CheckMode iCheckMode,
654  bool iNoPrettyPrint=false,
655  bool iNoThrowException=false
656  ) : JsonMidOSerializer
657  (
658  iOStream,
659  getDestinations(),
660  internal::sGlobalVersionNoTable,
661  kLastGlobalVersionNo,
662  kLastGlobalVersionNo,
663  iCheckMode,
664  iNoPrettyPrint,
665  iNoThrowException
666  )
667  { }
668 
669  //! JsonOSerializerのプロパティ返却(@ref Property 参照)
670  static bool hasProperty(Property iProperty)
671  {
672  return internal::hasPropertyJson(iProperty, true);
673  }
674 
675  //! std::stringをマルチ・パイト文字コードとして処理するかどうか指定する
676  void setCharIsMultiByte(bool iCharIsMultiByte)
677  {
678  mCharIsMultiByte=iCharIsMultiByte;
679  }
680 
683  using BaseSerializer::getRequireClearTracking;
686  using ErrorBase::isError;
687  using ErrorBase::resetError;
688 };
689 
690 #ifndef THEOLIZER_INTERNAL_DOXYGEN
691 // MidSerializer登録(トライバ処理用)
692 THEOLIZER_INTERNAL_REGISTER_MID_SERIALIZER(JsonOSerializer);
693 #endif // THEOLIZER_INTERNAL_DOXYGEN
694 
695 // ***************************************************************************
696 //! 回復用JsonSerializer
697 // ***************************************************************************
698 
699 // ---<<< 通常用 >>>---
700 
701 template<Destination uDefault=theolizerD::All, Destination... uDestinations>
703 {
704  THEOLIZER_INTERNAL_FRIENDS;
705  void AbstructSerializer() { } // インスタンス生成許可
706 
707  static internal::Destinations const& getDestinations()
708  {
709  static const internal::Destinations destinations{uDefault, uDestinations...};
710  return destinations;
711  }
712 
713  // グローバル・バージョン番号テーブルへのポインタへのポインタ
714  constexpr static internal::GlobalVersionNoTableBase const*const*const
715  kPtrGlobalVersionNoTable=&internal::sGlobalVersionNoTable;
716 
718  typedef internal::JsonMidISerializer MidSerializer;
719 
720  // Switcherアクセス用
721  using MidSerializer::kSerializerName;
722  using BaseSerializer::mIsSaver;
723 
724 public:
725  //! ifstream用std::ios_base::openmode
726  using MidSerializer::kOpenMode;
727 
728 #ifndef THEOLIZER_INTERNAL_DOXYGEN
729  static const bool kHasDestination=true;
730 #endif // THEOLIZER_INTERNAL_DOXYGEN
731 
732  //! コンストラクタ
734  (
735  std::istream& iIStream,
736  bool iNoThrowException=false
737  ) : JsonMidISerializer
738  (
739  iIStream,
740  getDestinations(),
741  internal::sGlobalVersionNoTable,
742  kLastGlobalVersionNo,
743  nullptr,
744  iNoThrowException
745  )
746  { }
747 
748  //! JsonISerializerのプロパティ返却(@ref Property 参照)
749  static bool hasProperty(Property iProperty)
750  {
751  return internal::hasPropertyJson(iProperty, false);
752  }
753 
754  //! std::stringをマルチ・パイト文字コードとして処理することを指定する
755  void setCharIsMultiByte(bool iCharIsMultiByte)
756  {
757  mCharIsMultiByte=iCharIsMultiByte;
758  }
759 
762  using BaseSerializer::getRequireClearTracking;
765  using ErrorBase::isError;
766  using ErrorBase::resetError;
767 
768 #ifndef THEOLIZER_INTERNAL_DOXYGEN
769  // メタ・デシリアライズ用
770  /*
771  メタ・シリアライズ処理検討後決定
772  現時点でメタ・シリアライズは実験的な実装なので、実用性がない。
773  それを製品版に含めるのはどうかと思う。
774  できるだけ、別ファイルへ分離することを検討する。
775  */
777  (
778  std::istream& iIStream,
779  std::ostream& iOStream,
780  bool iNoThrowException=false
781  ) : JsonMidISerializer
782  (
783  iIStream,
784  getDestinations(),
785  internal::sGlobalVersionNoTable,
786  kLastGlobalVersionNo,
787  &iOStream,
788  iNoThrowException
789  )
790  { }
791 #endif // THEOLIZER_INTERNAL_DOXYGEN
792 };
793 
794 #ifndef THEOLIZER_INTERNAL_DOXYGEN
795 // MidSerializer登録(トライバ処理用)
796 THEOLIZER_INTERNAL_REGISTER_MID_SERIALIZER(JsonISerializer);
797 #endif // THEOLIZER_INTERNAL_DOXYGEN
798 
799 //############################################################################
800 // End
801 //############################################################################
802 
803 } // namespace theolizer
804 
805 // ***************************************************************************
806 // DLL用の警告禁止解除
807 // ***************************************************************************
808 
809 #ifdef _MSC_VER
810  #pragma warning(pop)
811 #endif
812 
813 #endif // THEOLIZER_INTERNAL_SERIALIZER_JSON_H
CheckMode
型チェック・モード
ErrorInfo const & getErrorInfo() const
エラー情報返却(3-1-2.メンバ関数 参照)
Definition: report.h:861
theolizer名前空間
Definition: base.h:53
unsigned getGlobalVersionNo() const
処理中のグローバル・バージョン番号返却(3-1-2.メンバ関数 参照)
void clearTracking()
オブジェクト追跡の区切り(3-1-2.メンバ関数 参照)
TheolizerライブラリのAPI部
static bool hasProperty(Property iProperty)
JsonOSerializerのプロパティ返却(3-1-3.プロパティ 参照)
回復用中間JsonSerializer
回復用JsonSerializer
保存用JsonSerializer
void setCharIsMultiByte(bool iCharIsMultiByte)
std::stringをマルチ・パイト文字コードとして処理するかどうか指定する
bool isError()
エラー発生ならtrue(3-1-2.メンバ関数 参照)
Definition: report.h:864
型チェック無し
Destination
保存先シンボルを定義するscoped enum型
void setCharIsMultiByte(bool iCharIsMultiByte)
std::stringをマルチ・パイト文字コードとして処理することを指定する
保存用中間JsonSerializer
static bool hasProperty(Property iProperty)
JsonISerializerのプロパティ返却(3-1-3.プロパティ 参照)
Property
シリアライザが提供する機能(プロパティ)のリスト
CheckMode getCheckMode()
現在のCheckMode返却(3-1-2.メンバ関数 参照)