如何在 .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 中将双精度值转换为具有固定小数位数的小数类型值
如何在 Swift 中归档和取消归档自定义对象?或者如何在 Swift 中将自定义对象保存到 NSUserDefaults?