メンバとは異なる値を持つオブジェクト/クラスをすべてシリアライズできます。オブジェクトをバイトに変換できます。 これらのオブジェクトのリストを1つの大きなバイト配列に変換していましたが、どうすれば元に戻すことができますか?C#オブジェクトの配列にオブジェクトのバイト配列を変換します。
例オブジェクト:
using System;
using System.IO;
[Serializable]
public class MyItem {
internal string m_name = "";
internal int m_position = 0;
internal float m_color = 0f;
internal int m_direction = 0;
internal float m_power = 0f;
public MyItem(string name, int position, float color, int direction, float power) {
m_name = name;
m_position = position;
m_color = color;
m_direction = direction;
m_power = power;
}
public byte[] Serialize() {
using (MemoryStream m = new MemoryStream()) {
using (BinaryWriter writer = new BinaryWriter(m)) {
writer.Write(m_name);
writer.Write(m_position);
writer.Write(m_color);
writer.Write(m_direction);
writer.Write(m_power);
}
return m.ToArray();
}
}
public static MyItem Desserialize(byte[] data) {
string name;
int position;
float color;
int direction;
float power;
using (MemoryStream m = new MemoryStream(data)) {
using (BinaryReader reader = new BinaryReader(m)) {
name = reader.ReadString();
position = reader.ReadInt32();
color = reader.ReadSingle();
direction = reader.ReadInt32();
power = reader.ReadSingle();
}
}
return new MyItem(name, position, color, direction, power);
}
}
そしてバイト配列に変換する:
List<MyItem> itemlist = <...>;
List<byte[]> byteList = new List<byte[]>();
for (int i = 0; i < itemlist.Count; i++) {
byteList.Add(itemlist[i].Serialize());
}
byte[] data = byteList.SelectMany(bytes => bytes).ToArray();
バックの変換:
????????
集約配列を直列化オブジェクトのサイズのチャンクに分割して逆シリアル化する必要があります。 – itsme86
アイテム間にマーカーを入れないので、単一アイテムのバイトサイズを計算し、データをそのサイズのチャンクに分割し、各チャンクを別々に処理する必要があります。 – kiziu
オブジェクトの配列を直接シリアル化する必要があります。次に、配列全体を直列化解除することができます。 (NB。これは.NET全体のシリアル化への切り替えに基づいています。独自のものではなく、組み込み直列化を使用しているかのように型をマークしています) – Richard