C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: C#でクラスのサイズを取得したい


(過去ログ 107 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■63615 / inTopicNo.1)  C#でクラスのサイズを取得したい
  
□投稿者/ howling (4回)-(2012/09/13(Thu) 19:53:37)

分類:[.NET 全般] 

いつもお世話になっております。

C# VS2008 Windows7上で作業しているのですが、
ここで特定クラスのデータセーブ&ロードを行いたいと考えております。

似たような話があったのですが、

http://bbs.wankuma.com/index.cgi?mode=al2&namber=4995&KLOG=5

「そもそも取得する必要がない」と回答されており、
もしそうであれば別の案が欲しいと思い、ご質問致します。

//この上でbyte[] bytesSaveFileDataにファイルのデータを読み込む
unsafe
{
int iIterator = 0;
byte[] bytesNameLength = new byte[4];
Array.Copy(bytesSaveFileData, iIterator, bytesNameLength, 0, 4);
int iNameLength = int.Parse(Encoding.Unicode.GetString(bytesNameLength)); //データ名称の長さの取得(必ず4ケタ)
iIterator += 4;

byte[] bytesObjectName = new byte[iNameLength];
Array.Copy(bytesSaveFileData, iIterator, bytesTreeNodeName, 0, iNameLength);
string strObjectName = Encoding.Unicode.GetString(bytesObjectName); //データ名称の取得
iIterator += iNameLength;

//あるクラスにデータをコピーする(このクラスはほぼ構造体のような内容ですが、2,3個メソッドがあるためクラスにしています。)
SomeClass clsSomeClass = null;
byte[] bytesSomeClassData = new byte[sizeof(SomeClass)]; //ここで、CS0208のエラー
Array.Copy(bytesSaveFileData, iIterator, bytesSomeClassData, 0, iNameLength);
fixed (byte* pObjData = bytesSomeClassData)
{
clsSomeClass = *(clsSomeClass*)pObjData;
}
iIterator += sizeof(SomeClass); //やっぱりCS0208のエラー


//実際はこれより先も続きますので、サイズが欲しいといった具合です。
}


上のコードのコメントにもありますが、

データ名称の長さ
データ名称
データA
データB




のような形のバイナリファイルの読み込みです。

サイズを取得できるような良い方法はありますでしょうか…?
あるいは、全く別の方法を教えて頂けますと幸いです。

以上
宜しくお願い致します。
引用返信 編集キー/
■63617 / inTopicNo.2)  Re[1]: C#でクラスのサイズを取得したい
□投稿者/ 納豆 (2回)-(2012/09/13(Thu) 20:07:15)
こんばんわ。

バイナリで型通り保存すると、要素を増やしたり、順番が変わったり、削除したりすると以前のデータが使えなくなってしまいます。
どうしても、バイナリで保存する必要があるなら仕方ありませんが。

自分の場合は、クラスをXMLにシリアライズしています。
XmlSerializerを使用して保存します。超便利です。

http://dobon.net/vb/dotnet/file/xmlserializer.html
ここに詳しく方法が書いてあります。

引用返信 編集キー/
■63619 / inTopicNo.3)  Re[2]: C#でクラスのサイズを取得したい
□投稿者/ 甕星 (1回)-(2012/09/13(Thu) 22:57:43)
バイナリでシリアル化したいならSerializable属性を使用する。

>iIterator += sizeof(SomeClass); //やっぱりCS0208のエラー

どうしてもサイズを取得したいなら、unsafeコードを記述する必要があったかと。
引用返信 編集キー/
■63623 / inTopicNo.4)  Re[2]: C#でクラスのサイズを取得したい
□投稿者/ howling (5回)-(2012/09/14(Fri) 10:30:23)
納豆様

ご返信ありがとうございます。
そういえばXmlSerializerの存在を失念しておりました!
こちらでやっていこうと思います。
ありがとうございました。


No63617 (納豆 さん) に返信
> こんばんわ。
>
> バイナリで型通り保存すると、要素を増やしたり、順番が変わったり、削除したりすると以前のデータが使えなくなってしまいます。
> どうしても、バイナリで保存する必要があるなら仕方ありませんが。
>
> 自分の場合は、クラスをXMLにシリアライズしています。
> XmlSerializerを使用して保存します。超便利です。
>
> http://dobon.net/vb/dotnet/file/xmlserializer.html
> ここに詳しく方法が書いてあります。
>
解決済み
引用返信 編集キー/
■63624 / inTopicNo.5)  Re[3]: C#でクラスのサイズを取得したい
□投稿者/ howling (6回)-(2012/09/14(Fri) 10:33:59)
甕星様

ご返信ありがとうございます。
上記のコードにもあるのですが、
unsafeを実は使っているのです。

で…、おそらくなのですが、
ご指摘の場合は構造体にしないとならないのでは?と思っております。
自作クラスの場合はうまくいかないようです。
(今回勉強になりました)

もし誤った認識などございましたら、
またご回答頂けますと幸いです。
引用返信 編集キー/
■63625 / inTopicNo.6)  Re[3]: C#でクラスのサイズを取得したい
□投稿者/ Jitta (8回)-(2012/09/14(Fri) 21:54:39)
Jitta さんの Web サイト
No63623 (howling さん) に返信

 マネージ クラスはサイズ計算できませんよ。CS0208 の説明ページ、そこからリンクしているページに書いてあります。
 私は、private なインナークラスをつくって、それをシリアライズします。同じように、private なインナー構造体を作れば、できるかも。


あと、最後の投稿の“解決済み”がトップに反映されるので、面倒ですが“解決済み”をチェックしてくださいね。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -