如何将对象序列化为二进制
本文关键字:二进制 序列化 对象 | 更新日期: 2023-09-27 17:53:11
我在windows窗体中创建电话簿,我需要在binaryForm中编写ContactList以保存数据。
最好的方法是什么?我应该把它的几个字段分开写,还是我可以把它作为一个完整的对象写然后读?
联系人有以下字段:
- Guid ID
- 字符串名称
- string lastName
- 字符串邮件 弦phoneNumber
BinaryWriter
不提供对象序列化。如果您愿意,它允许您编写自己的序列化代码,但是您仍然需要完成所有的工作—它只是处理与流通信的开销并为您执行一些基本编码。如果您的场景很简单,这可能是好的,在这种情况下玩得开心。但是,在大多数情况下,您可能希望将这种类型的代码推迟到专用的序列化库中。在许多情况下,这只意味着使用json或xml序列化器。如果你真的真的想要二进制,那也很好- BinaryFormatter
是内置的,但有很多版本/平台问题,我找不到我推荐它;但其他二进制序列化器,如protobuf-net
,使用起来很简单,效率很高,并且可以在各种平台上工作(披露:我是作者,但它是免费的:我不卖任何东西)。
分类(需要为Serializable
):
[Serializable]
public class someType
{
public int X { set; get; }
public int Y { set; get; }
}
使用二进制写入器:
public static byte[] Serialize(someType obj)
{
byte[] bytes = null;
using (var stream = new MemoryStream())
{
using (var writer = new BinaryWriter(stream))
{
writer.Write(obj.X);
writer.Write(obj.Y);
}
bytes = stream.ToArray();
}
return bytes;
}
public static someType Deserialize(byte[] data)
{
var obj = new someType();
using (var stream = new MemoryStream(data))
{
using (var reader = new BinaryReader(stream))
{
obj.X = reader.ReadInt32();
obj.Y = reader.ReadInt32();
}
}
return obj;
}
用法:
var obj = new someType() { X = 10 };
byte[] data = Serialize(obj);
someType obj2 = Deserialize(data);
或BinaryFormatter
:
byte[] data = null;
using (MemoryStream ms = new MemoryStream())
{
BinaryFormatter binaryFormatter = new BinaryFormatter();
binaryFormatter.Serialize(ms, obj);
data = ms.ToArray();
}
using (MemoryStream ms = new MemoryStream(data))
{
BinaryFormatter binaryFormatter2 = new BinaryFormatter();
var objDeserialized = binaryFormatter2.Deserialize(ms) as someType;
}