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

时间:2016-06-29 10:52:10

标签: c#

我在Windows窗体中创建电话簿,我需要在binaryForm中编写ContactList来保存数据。

最好的方法是什么?我可以单独编写几个字段,还是可以编写然后将其作为完整对象读取?

联系人有以下字段:

  • Guid ID
  • 字符串名称
  • string lastName
  • string Email
  • string phoneNumber

2 个答案:

答案 0 :(得分:2)

BinaryWriter不提供对象序列化。它允许你编写自己的序列化代码,但是你仍然需要完成所有工作 - 它只是处理与流交谈的开销并为你做一些原始编码。如果您的场景很简单,那可能没问题,在这种情况下玩得很开心。但是,在大多数情况下,您可能希望将此类代码推迟到专用的序列化库。在许多情况下,这只意味着使用json或xml序列化程序。如果你真的想要二进制文件,那也没关系 - BinaryFormatter是内置的,但是版本/平台问题有很多很多,我无法在我的推荐中找到它;但是像protobuf-net这样的其他二进制序列化器很容易使用,效率很高,而且可以在各种平台上工作(披露:我是作者,但它是免费的:我不卖任何东西)。

答案 1 :(得分:1)

班级(需要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;
}