ネットワークとプログラム

ネットワークとプログラムで困ったこと、勉強したこと、その他をつづっていくページです。

前日の閲覧数
189PV
+SHARE
Twitter Facebook RSS

C#で構造体をシリアル化に変換

ネットワークプログラムにおいて、アプリケーション側でヘッダーとデータ部分を定義して、データを送信するときに調査したものを以下にメモする。
以前は、C++でポイントとmemcpy()を使っていましたが、C#では使いづらいので、調査した結果は以下の通りです。

ネットワーク上でデータを送信するためには、byte[]に変換する必要がある。プログラミングの管理上、構造体またはクラスにする必要がある。構造体をbyte[]に変換するために、string,intからbyte[]に変換しても良いが、手間が掛かる。

string->byte[]
byte[] byteBuffer= Encoding.Unicode.GetBytes(str);

int -> byte[]
byte[] byteBuffer = BitConverter.GetBytes(this.iWidth);


一つずつ変換すると変数が多いと手間がかかる。

そのため、BinaryFormatter を使い、シリアル化することによって、byte[]に変換する。ポイントは、BiaaryFormatterは、Stream型でサポートすること。

シリアル化手順
(1)BinaryFormatterの領域を確保
(2)MemoryStream の領域確保
(3)BinaryFormatterのSerializeメソッドを使い、(2)と構造体を引数で渡す。
MemoryStreamの中でシリアル化されて保存される。
(4)MemoryStreamからToArrayメソッドを使い byte[]を抜き出す。

逆は、上記の逆なので説明は略。


プログラムとして、

1.シリアル化

構造体として、 _StructTest型のtestStructDataとして領域を取得する。

BinarrayFormmater = new BinaryFormatter();
MemoryStream mem = new MemoryStream;
formatter.Serialize(mem,testStructData);

byte[] byteData = mem.ToArray();

mem.Close();

2.デシリアル化
MemoryStream mem = new MemoryStream(byteData.Length);
mem.Write(byteData,0,byteData.Length);
mem.Seek(0,SeekOrigin.Begin); ←これを忘れない。
BinaryFormmater formmater = new BinaryFormatter();
testStructData = (_StructData) formmaer.Deserialize(mem);
mem.Close();

これで、手軽に構造体をbyte[]に変換できる。
memcpy()を使わなくてもできる。

メモメモ
ジャンル:
ウェブログ

あわせて読む

人気記事

  1. BINDでクライアントからのリクエストで「Query refused」
  2. アパマンショップには気をつけようと思う
  3. DialogBoxでエラー(1814)