我在Windows窗体中创建电话簿,我需要在binaryForm中编写ContactList来保存数据。
最好的方法是什么?我可以单独编写几个字段,还是可以编写然后将其作为完整对象读取?
联系人有以下字段:
答案 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;
}