如何将对象序列化为二进制

本文关键字:二进制 序列化 对象 | 更新日期: 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;
}