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

Posted

技术标签:

【中文标题】如何在 .NET 中将自定义类型保存为二进制数据?【英文标题】:How can I save a custom type as binary data in .NET? 【发布时间】:2011-09-26 11:35:33 【问题描述】:

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

x 是 身份证 层

我已经将它保存为 XML 有一段时间了,问题是,文件开始变得庞大,因为我要保存成百上千个这样的对象,而对于这样的东西来说,XML 有点庞大。我尝试切换到 Json,但它也太大了(我承认,更好)。

我的问题

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

我在制作自己的服务器时尝试过读取字节。我通常最终会感到沮丧和放弃。我希望这不是太相似(我的直觉不是这样)。

编辑

抱歉,伙计们,我忘了提,我使用的是VB.NET,所以所有.NET 的答案都是可以接受的! :)

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

【问题讨论】:

保存到字节是二进制序列化。顺便说一句,您使用的是哪种开发语言? 如何将对象保存为 XML?你在使用 XmlSerializer 类吗? @sll 我只是手动保存它们,我无法序列化它,因为它是我从多个数组中手动​​挑选的数据。 @sll 我想我可以序列化单个元素.... 所以你没有一个类来表示/封装要序列化的项目? 【参考方案1】:

我会使用 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;

然后就可以序列化了,例如:

List<Whatever> data = ...
Serializer.Serialize(file, data);

并反序列化:

var data = Serializer.Deserialize<List<Whatever>>(file);

工作完成;快速二进制输出。您可能可以通过在没有任何标记等的情况下手动对所有读/写进行手动编码来获得一点,但上面的维护会少很多。它也很容易加载到任何其他具有可用“协议缓冲区”实现的平台(即:大多数)。

【讨论】:

看起来很有希望,我正在尝试。 我刚刚收到一个错误,我不知道下一步该做什么:Duplicate field-number detected; 1 on: RedSim.RedSimEngine.Whatever @Dade 你用的是什么号码?请注意,我的在类 (1,2,3,4) 中是唯一的 - 另请注意,它们必须是正整数(0、-1 等都是非法的) 哦,我的错,你一定是我试过后改的。哈哈。谢谢,我现在就试试。 @Dade:谢谢,很高兴知道!我也使用过 protobuf-net,但将它与 ZeroC Ice 序列化结果进行了比较。 protobuf-net 也赢得了这个挑战【参考方案2】:

替代方案: 为什么不使用 xml 和 zip(或其他压缩方式)

优势: * 它仍然是“人类”可读的 * 文本文件通常具有良好的压缩系数 还有你正在使用什么编程语言? 在 C/C++ 中,或者您使用数据创建一个结构 重新解释将结构转换为 byte * 并将 sizeof 字节写入文件......就这么简单 (假设结构是固定大小的(id 和层也是固定大小的变量,如 int)

【讨论】:

【参考方案3】:

为什么不使用 mysql 或 SQL 之类的数据库?

【讨论】:

出于同样的原因,我不会使用它,例如 word、excel 或大多数其他程序不使用数据库来保存文件。 对不起,我想我误解了你。我以为您只需要存储 4 个变量,但没有得到您需要将它们存储在文件中。以为这只是您存储的信息。我的错。

以上是关于如何在 .NET 中将自定义类型保存为二进制数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 3 中将自定义类保存为 CoreData 实体的属性?

如何使用 Swashbuckle.AspNetCore 在 Swagger 模式中将自定义泛型类型公开为字符串

如何在 .NET 中将双精度值转换为具有固定小数位数的小数类型值

如何在页面模板中将ACF关系帖子显示为循环

如何在 Swift 中归档和取消归档自定义对象?或者如何在 Swift 中将自定义对象保存到 NSUserDefaults?

如何在数据库中将 JSON 保存为 CLOB 或 JSON 类型