ここから本文です

C/C++でオブジェクトをバイナリに保存できないかといろいろ探しています それらし...

tts********さん

2013/4/1920:53:53

C/C++でオブジェクトをバイナリに保存できないかといろいろ探しています
それらしい関数やヒントすら見つけられずに止まっています
自作しようかと思っているのですが

クラス/オブジェクトのメンバ名とその内容を取得する方法がわからずにまた止まってしまいました
どうすればいいのでしょうか?
私はオブジェクトのメンバ名とその内容を取得する方法が知りたいです
知っていたらよろしくお願いいたします
ちなみに
Windows Vista
Visual C++ 2010 Express
.NET Framework 4.5
です
.NETは逆コンパイラされそうだから使いたくはないのですが・・・

閲覧数:
3,497
回答数:
4

違反報告

ベストアンサーに選ばれた回答

abi********さん

編集あり2013/4/2611:37:47

[現状]

それは、無理です。
C++では、その手のことが無理なので、マイクロソフト系開発環境では、C#と言うプログラミング言語を作ったからです。


<型情報の仕組み>

C#では、全ての型が、objectと言うクラスから派生したクラスになっています。
ユーザー定義のクラスはもちろん、int型等の標準型も、objectクラスから派生したクラスになっています。
そのobjectクラスは、質問の類のこと(シリアライズ等)が行なえるように、必要最小限の各種型情報を持つ仕組みになっています。


<動的処理>
PythonとRubyと言うプログラミング言語は、動的言語と言って、実行時の判断でプログラムの構成を決められます。
そのため、実行時に型種別を決められるようにした、抽象的な型が用意されています。
よって、PythonとRubyは、質問の類のこと(シリアライズ等)が得意なプログラミング言語です。
ちなみに、C#は、動的言語と呼ばれるレベルではないですが、PythonやRubyのような動的処理が行なえるような機能を取り込んでいます。



[将来]

C++11と言う改定を取り入れたコンパイラーが、一般普及して来ると、SOAPと言うプロトコルを標準的に使えるC++コンパイラーが増えてきます。
ちなみに、SOAPとは、通信の電文を、上記で説明したような、オブジェクトの単位で、きちんと型情報を持たせたプロトコルです。
SOAP形式の電文を作ったり、SOAP形式のファイル保存が可能なC++11コンパイラーが増えてくれば、そのSOAP形式のものをバイナリ形式で扱う機能も搭載されると思います。
なお、以前に、「C++11によるコンパイラーは、ありますか」と言う質問で、「本格的にC++11仕様を取り入れたコンパイラーは、まだ出ていない」と言う回答でした。
よって、少なくとも、オブジェクト単位のファイル保存は、近いうちに可能になる可能性が高いです。C++11によるコンパイラーが増え出せば。
なお、前述のオブジェクトの型情報の充実や、動的機能の拡張等については、今後のC++の改定次第です。


[結論]

1.
自分でコンパイラーを作る。
(「コンパイラーを作る」と言うと、アプリケーションソフトの開発が中心のプログラマーは、驚く人もいると思います。しかし、組み込み系等のハードに近い処理を作っているプログラマーにとっては、それ程不思議ではないです)

2.
C/C++ と C# との連携にする。


ちなみに私は、後者の2を選びました。





[追記: 逆コンパイラの件]

質問の類のこと(型情報の詳細の取得等)が可能だと、C++は、逆コンパイラがやりやすい言語になってしまいます。
それぞれに特徴があるのですから、連携して活用するのが、一番良いと思います。


特に、逆コンパイルの問題だけならば、C/C++で作ったDLLをC# から呼び出せば良いと思います。
C++形式のDLL作成は、COMと言うテクノロジーを使うので、難易度が高いです。
しかし、C言語形式のDLL作成ならば、Win32 DLLで、比較的簡単です。


あと、余談ですが、C# は、将来、クラウドコンピューティングのサービスを作ることが主要目的とするプログラミング言語なので、逆コンパイルし易いのは、構わないことです。
泥棒に入って、人の家のサーバー機で逆コンパイルする人なんて、めったにいないでしょうから。
C#で開発中の製品があるのでしたら、サーバーシステムにして、インターネット経由で提供するサービスにすると言う選択肢もあります。




[追記]

ちなみに、VC++(プログラミング言語は、C++)で、ユーザー定義型等をフラットなデーターバッファとする手法は、マーシャリングと言います。
COM/DCOMやATLと言う技術を解説した本にのっています(COM/DCOMとか、ATLと題目に書かれた本で、ある程度詳しい本に限ります)。
ただし、.NET系(C#等)の該当機能に比べて、かなり扱いにくいので、質問者さんが思っている通りの成果を出せるかは疑問です。

この質問は投票によってベストアンサーに選ばれました!

ベストアンサー以外の回答

1〜3件/3件中

並び替え:回答日時の
新しい順
|古い順

chg********さん

2013/4/2401:28:46

C++のオブジェクトというのがネイティブクラス(classやstruct)のオブジェクトであれば、xianren428さんの取り上げたBoost.Serializationが一番有名で、私もおすすめします。
http://www.kmonos.net/alang/boost/classes/serialization.html
https://sites.google.com/site/boostjp/tips/serialize

一方、C++/CLIマネージクラス(ref class、ref struct、value class、value struct)のオブジェクトであれば、BinaryFormatterなどが使えます。
http://dobon.net/vb/dotnet/file/binaryformatter.html
http://msdn.microsoft.com/ja-jp/library/system.runtime.serializatio...
2つ目のURLのページにはC++の例もあります。

k03********さん

2013/4/1921:27:24

ttse092さん

できたとこまで書く。

意味不明だが。

xia********さん

2013/4/1921:25:02

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる