source: dev/trunk/abdev/BasicCompiler_Common/src/BoostSerializationSupport.cpp@ 340

Last change on this file since 340 was 322, checked in by dai_9181, 17 years ago

コンパイラ組み込みテンプレートエンジンを実装。
静的リンクライブラリ、デバッグ情報の内部形式をテキストからバイナリに変更した。

File size: 10.3 KB
Line 
1#include <string>
2#include <vector>
3#include <fstream>
4
5#include <windows.h>
6#include <stdio.h>
7#include <string.h>
8#include <math.h>
9#include <commctrl.h>
10#include <time.h>
11#include <limits.h>
12#include <shlobj.h>
13
14//boost libraries
15#include <boost/foreach.hpp>
16
17#include <jenga/include/common/String.h>
18
19#include "../common.h"
20
21#include <boost/archive/xml_oarchive.hpp>
22#include <boost/archive/xml_iarchive.hpp>
23#include <boost/archive/text_oarchive.hpp>
24#include <boost/archive/text_iarchive.hpp>
25#include <boost/archive/binary_oarchive.hpp>
26#include <boost/archive/binary_iarchive.hpp>
27#include <boost/serialization/string.hpp>
28#include <boost/serialization/access.hpp>
29#include <boost/serialization/level.hpp>
30#include <boost/serialization/vector.hpp>
31#include <boost/serialization/map.hpp>
32#include <boost/serialization/version.hpp>
33#include <boost/serialization/is_abstract.hpp>
34
35#include <BoostSerializationSupport.h>
36#include <Compiler.h>
37
38using namespace Jenga::Common;
39
40template<class T_xml_schema> void BoostSerializationSupport<T_xml_schema>::echo( const char *msg ) const
41{
42 MessageBox( NULL, msg, "XMLシリアライズの例外", MB_OK );
43}
44template<class T_xml_schema> bool BoostSerializationSupport<T_xml_schema>::ReadXml( istream& ifs, bool isShowExceptionMessage )
45{
46 bool isSuccessful = false;
47
48 try{
49 boost::archive::xml_iarchive ia(ifs);
50
51 // ファイルから読込
52 ia >> boost::serialization::make_nvp( RootTagName(), *(T_xml_schema *)this );
53
54 isSuccessful = true;
55 }
56 catch( boost::archive::archive_exception e )
57 {
58 if( isShowExceptionMessage )
59 {
60 echo( e.what() );
61 }
62 }
63 catch(...){
64 if( isShowExceptionMessage )
65 {
66 echo( "archive_exception以外の不明な例外" );
67 }
68 }
69
70 if( !isSuccessful )
71 {
72 return false;
73 }
74
75 return true;
76}
77template<class T_xml_schema> bool BoostSerializationSupport<T_xml_schema>::WriteXml( ostream& ofs, bool isShowExceptionMessage ) const
78{
79 bool isSuccessful = false;
80
81 try{
82 boost::archive::xml_oarchive oa(ofs);
83
84 // ファイルに書き出し
85 oa << boost::serialization::make_nvp( RootTagName(), *(T_xml_schema *)this );
86
87 isSuccessful = true;
88 }
89 catch( boost::archive::archive_exception e )
90 {
91 if( isShowExceptionMessage )
92 {
93 echo( e.what() );
94 }
95 }
96 catch(...){
97 if( isShowExceptionMessage )
98 {
99 echo( "archive_exception以外の不明な例外" );
100 }
101 }
102
103 if( !isSuccessful )
104 {
105 return false;
106 }
107
108 return true;
109}
110template<class T_xml_schema> bool BoostSerializationSupport<T_xml_schema>::ReadXml( const string &xmlFilePath, bool isShowExceptionMessage )
111{
112 // 入力アーカイブの作成
113 std::ifstream ifs( xmlFilePath.c_str() );
114
115 bool result = ReadXml(ifs,isShowExceptionMessage);
116
117 // 入力を閉じる
118 ifs.close();
119
120 return result;
121}
122template<class T_xml_schema> bool BoostSerializationSupport<T_xml_schema>::WriteXml( const string &xmlFilePath, bool isShowExceptionMessage ) const
123{
124 // 出力アーカイブの作成
125 std::ofstream ofs( xmlFilePath.c_str() );
126
127 bool result = WriteXml(ofs,isShowExceptionMessage);
128
129 // 出力を閉じる
130 ofs.close();
131
132 return result;
133}
134template<class T_xml_schema> bool BoostSerializationSupport<T_xml_schema>::ReadXmlString( const std::string &xmlString )
135{
136 bool isSuccessful = false;
137
138 // 入力アーカイブの作成
139 std::istringstream iss( xmlString );
140
141 try{
142 boost::archive::xml_iarchive ia(iss);
143
144 // 文字列ストリームから読込
145 ia >> boost::serialization::make_nvp( RootTagName(), *(T_xml_schema *)this );
146
147 isSuccessful = true;
148 }
149 catch(...){
150 // 失敗
151 }
152
153 if( !isSuccessful )
154 {
155 return false;
156 }
157
158 return true;
159}
160template<class T_xml_schema> bool BoostSerializationSupport<T_xml_schema>::WriteXmlString( std::string &xmlString ) const
161{
162 // 出力アーカイブの作成
163 std::ostringstream oss;
164
165 bool isSuccessful = false;
166 try{
167 boost::archive::xml_oarchive oa(oss);
168
169 // 文字列ストリームに書き出し
170 oa << boost::serialization::make_nvp( RootTagName(), *(T_xml_schema *)this );
171
172 isSuccessful = true;
173 }
174 catch( boost::archive::archive_exception e )
175 {
176 echo( e.what() );
177 }
178 catch(...){
179 echo( "archive_exception以外の不明な例外" );
180 }
181
182 if( !isSuccessful )
183 {
184 return false;
185 }
186
187 xmlString = oss.str();
188
189 return true;
190}
191
192template<class T_xml_schema> bool BoostSerializationSupport<T_xml_schema>::ReadBinaryFile( const string &filePath, bool isShowExceptionMessage )
193{
194 // 入力アーカイブの作成
195 std::ifstream ifs( filePath.c_str(), ios::in | ios::binary );
196
197 bool isSuccessful = false;
198 try{
199 boost::archive::binary_iarchive ia(ifs);
200
201 // ファイルから読込
202 ia >> boost::serialization::make_nvp( RootTagName(), *(T_xml_schema *)this );
203
204 isSuccessful = true;
205 }
206 catch( boost::archive::archive_exception e )
207 {
208 if( isShowExceptionMessage )
209 {
210 echo( e.what() );
211 }
212 }
213 catch(...){
214 if( isShowExceptionMessage )
215 {
216 echo( "archive_exception以外の不明な例外" );
217 }
218 }
219
220 // 入力を閉じる
221 ifs.close();
222
223 if( !isSuccessful )
224 {
225 return false;
226 }
227
228 return true;
229}
230template<class T_xml_schema> bool BoostSerializationSupport<T_xml_schema>::WriteBinaryFile( const string &filePath, bool isShowExceptionMessage ) const
231{
232 // 出力アーカイブの作成
233 std::ofstream ofs( filePath.c_str(), ios::out | ios::binary );
234
235 bool isSuccessful = false;
236 try{
237 boost::archive::binary_oarchive oa(ofs);
238
239 // ファイルに書き出し
240 oa << boost::serialization::make_nvp( RootTagName(), *(T_xml_schema *)this );
241
242 isSuccessful = true;
243 }
244 catch( boost::archive::archive_exception e )
245 {
246 if( isShowExceptionMessage )
247 {
248 echo( e.what() );
249 }
250 }
251 catch(...){
252 if( isShowExceptionMessage )
253 {
254 echo( "archive_exception以外の不明な例外" );
255 }
256 }
257
258 // 出力を閉じる
259 ofs.close();
260
261 if( !isSuccessful )
262 {
263 return false;
264 }
265
266 return true;
267}
268
269template<class T_xml_schema> bool BoostSerializationSupport<T_xml_schema>::ReadBinaryString( const std::string &binaryString )
270{
271 bool isSuccessful = false;
272
273 // 入力アーカイブの作成
274 std::istringstream iss( binaryString, ios::in | ios::binary );
275
276 try{
277 boost::archive::binary_iarchive ia(iss);
278
279 // 文字列ストリームから読込
280 ia >> boost::serialization::make_nvp( RootTagName(), *(T_xml_schema *)this );
281
282 isSuccessful = true;
283 }
284 catch( boost::archive::archive_exception e )
285 {
286 echo( e.what() );
287 }
288 catch(...){
289 echo( "archive_exception以外の不明な例外" );
290 }
291
292 return isSuccessful;
293}
294template<class T_xml_schema> bool BoostSerializationSupport<T_xml_schema>::WriteBinaryString( std::string &binaryString ) const
295{
296 // 出力アーカイブの作成
297 std::ostringstream oss( "", ios::out | ios::binary );
298
299 bool isSuccessful = false;
300 try{
301 boost::archive::binary_oarchive oa(oss);
302
303 // 文字列ストリームに書き出し
304 oa << boost::serialization::make_nvp( RootTagName(), *(T_xml_schema *)this );
305
306 isSuccessful = true;
307 }
308 catch( boost::archive::archive_exception e )
309 {
310 echo( e.what() );
311 }
312 catch(...){
313 echo( "archive_exception以外の不明な例外" );
314 }
315
316 binaryString = oss.str();
317
318 return isSuccessful;
319}
320
321template<class T_xml_schema> bool BoostSerializationSupport<T_xml_schema>::ReadText( const string &filePath, bool isShowExceptionMessage )
322{
323 // 入力アーカイブの作成
324 std::ifstream ifs( filePath.c_str() );
325
326 bool isSuccessful = false;
327 try{
328 boost::archive::text_iarchive ia(ifs);
329
330 // ファイルから読込
331 ia >> boost::serialization::make_nvp( RootTagName(), *(T_xml_schema *)this );
332
333 isSuccessful = true;
334 }
335 catch( boost::archive::archive_exception e )
336 {
337 if( isShowExceptionMessage )
338 {
339 echo( e.what() );
340 }
341 }
342 catch(...){
343 if( isShowExceptionMessage )
344 {
345 echo( "archive_exception以外の不明な例外" );
346 }
347 }
348
349 // 入力を閉じる
350 ifs.close();
351
352 if( !isSuccessful )
353 {
354 return false;
355 }
356
357 return true;
358}
359template<class T_xml_schema> bool BoostSerializationSupport<T_xml_schema>::WriteText( const string &filePath, bool isShowExceptionMessage ) const
360{
361 // 出力アーカイブの作成
362 std::ofstream ofs( filePath.c_str() );
363
364 bool isSuccessful = false;
365 try{
366 boost::archive::text_oarchive oa(ofs);
367
368 // ファイルに書き出し
369 oa << boost::serialization::make_nvp( RootTagName(), *(T_xml_schema *)this );
370
371 isSuccessful = true;
372 }
373 catch( boost::archive::archive_exception e )
374 {
375 if( isShowExceptionMessage )
376 {
377 echo( e.what() );
378 }
379 }
380 catch(...){
381 if( isShowExceptionMessage )
382 {
383 echo( "archive_exception以外の不明な例外" );
384 }
385 }
386
387 // 出力を閉じる
388 ofs.close();
389
390 if( !isSuccessful )
391 {
392 return false;
393 }
394
395 return true;
396}
397
398template<class T_xml_schema> bool BoostSerializationSupport<T_xml_schema>::ReadTextString( const std::string &textString )
399{
400 bool isSuccessful = false;
401
402 // 入力アーカイブの作成
403 std::istringstream iss( textString );
404
405 try{
406 boost::archive::text_iarchive ia(iss);
407
408 // 文字列ストリームから読込
409 ia >> boost::serialization::make_nvp( RootTagName(), *(T_xml_schema *)this );
410
411 isSuccessful = true;
412 }
413 catch(...){
414 // 失敗
415 }
416
417 if( !isSuccessful )
418 {
419 return false;
420 }
421
422 return true;
423}
424template<class T_xml_schema> bool BoostSerializationSupport<T_xml_schema>::WriteTextString( std::string &textString ) const
425{
426 // 出力アーカイブの作成
427 std::ostringstream oss;
428
429 bool isSuccessful = false;
430 try{
431 boost::archive::text_oarchive oa(oss);
432
433 // 文字列ストリームに書き出し
434 oa << boost::serialization::make_nvp( RootTagName(), *(T_xml_schema *)this );
435
436 isSuccessful = true;
437 }
438 catch( boost::archive::archive_exception e )
439 {
440 echo( e.what() );
441 }
442 catch(...){
443 echo( "archive_exception以外の不明な例外" );
444 }
445
446 if( !isSuccessful )
447 {
448 return false;
449 }
450
451 textString = oss.str();
452
453 return true;
454}
455
456template<class T_xml_schema> bool BoostSerializationSupport<T_xml_schema>::ReadXmlFromString( const std::string &textString )
457{
458 bool isSuccessful = false;
459
460 // 入力アーカイブの作成
461 std::istringstream iss( textString );
462
463 try{
464 boost::archive::xml_iarchive ia(iss);
465
466 // 文字列ストリームから読込
467 ia >> boost::serialization::make_nvp( RootTagName(), *(T_xml_schema *)this );
468
469 isSuccessful = true;
470 }
471 catch(...){
472 // 失敗
473 }
474
475 if( !isSuccessful )
476 {
477 return false;
478 }
479
480 return true;
481}
482
483
484#include <Compiler.h>
485#include <logger.h>
486
487template class Jenga::Common::BoostSerializationSupport<ObjectModule>;
488template class Jenga::Common::BoostSerializationSupport<LoggerSetting>;
Note: See TracBrowser for help on using the repository browser.