如何在.NET中将自定义类型保存为二进制数据?

Fre*_*nöw 4 .net vb.net byte save

我正在创建一些保存文件的东西.在大多数情况下,它只是保存具有4个值的对象.

  • X
  • ÿ
  • ID

我一直把它保存为XML一段时间,问题是,文件开始变得巨大,因为我节省了数百到数千个这些对象,而XML对于这样的事情来说有点笨重.我尝试转换到Json,但它也太大了(我会承认,但更好).

我的问题

我知道很多程序直接使用字节保存以节省空间.我想做这个.假设我有300个具有属性X,Y,Id和Layer的对象,我怎么能将其保存为文件x作为字节并稍后加载?

我曾经尝试过制作自己的服务器时读取字节数.我通常最终感到沮丧和放弃.我希望这不太相似(我的直觉另有说法).

编辑

哦对不起伙计们,我忘了提,我正在使用VB.NET所以所有.NET答案都可以接受!:)

此外,所有这些值都是整数.

Mar*_*ell 6

我会使用protobuf-net(我愿意;我有偏见......).它是一个开源的.NET序列化程序,它使用属性(嗯,在v2中是可选的)来指导它.例如,使用C#语法(纯粹为了我的方便 - 引擎不关心你使用的语言):

[ProtoContract]
public class Whatever {
    [ProtoMember(1)]
    public int X {get;set;}
    [ProtoMember(2)]
    public int Y {get;set;}
    [ProtoMember(3)]
    public long Id {get;set;}
    [ProtoMember(4)]
    public string Layer {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以序列化,例如:

List<Whatever> data = ...
Serializer.Serialize(file, data);
Run Code Online (Sandbox Code Playgroud)

和反序列化:

var data = Serializer.Deserialize<List<Whatever>>(file);
Run Code Online (Sandbox Code Playgroud)

任务完成; 快速二进制输出.您可以通过手动编码所有读取/写入而不需要任何标记等获得更紧凑的东西,但上面的维护要少得多.它也很容易加载到任何其他具有"协议缓冲区"实现的平台(其中大部分都是).

  • @Dade:谢谢,有趣的知道!我也使用过protobuf-net但是将它与ZeroC Ice序列化结果进行了比较.protobuf-net也赢得了这一挑战 (2认同)