用于在 C# 中创建自定义跨平台文件格式的序列化方法

本文关键字:格式 文件 序列化 方法 跨平台 自定义 创建 用于 | 更新日期: 2023-09-27 18:36:53

我正在编写一个 .NET 4.0 应用程序,我想为其创建自定义文件格式进行序列化:

  • 数据表(可能很大)
  • 自定义类(包含字符串和数值属性、枚举和类列表)
  • 图像

我想使这种文件格式在未来不断发展(通过添加属性、图像等)。我还需要这种文件格式在其他平台上可读,例如 Android 和 iOS,以防将来创建移动应用程序。

我见过几个类似的问题,大多数解决方案建议使用Protocol Buffers,JSON,XML或像SQLite这样的轻量级SQL RDBMS。

我在这些问题中不经常看到的是许可证和压缩的主题。由于我将应用程序作为商业产品分发,因此我想使用允许包含在商业产品中的 .NET 库。由于文件格式将包括一个可能很大的数据表,我需要一种具有良好压缩率的方法。

你能帮我找到满足我需求的最佳解决方案吗?

提前致谢

用于在 C# 中创建自定义跨平台文件格式的序列化方法

就个人而言,我建议避免考虑"表"的序列化。而不是像同类类型化实体列表这样的东西。您以后始终可以向这些实体添加成员(大多数序列化程序都可以)。在最小开销和开放许可方面,我谦虚地认为protobuf-net将是一个合理的选择 - 它是谷歌"协议缓冲区"规范的实现,旨在在线高效,版本容错(特别是在添加成员时)。这留下了压缩;现在:由于连线格式已经非常简洁(它是一种密集的二进制格式,仅使用数字作为字段标识符 - 而不是名称),因此它实际上不包含任何"压缩";但是,如果您的数据以文本(长描述等)为主,那么是的:仍然可以减少一些字节 - 但您可以通过将序列化和压缩视为单独的来做到这一点 - 只需通过类似 GZipStream 的东西运行它。由于 .NET 中的Stream可以充当装饰器,因此这通常是微不足道的,即

using(var target = GetTheUndrelyingStream())
using(var zip = new GZipStream(target))
{
    Serializer.Serialize(zip, obj);
}

JulienVan,

在考虑商业使用的软件许可证时,我的公司倾向于使用MIT和BSD。这些许可证允许商业用途和分发,没有太多限制。

有很多关于许可的指南,这里有一个我认为是不错的:http://www.smashingmagazine.com/2011/06/14/understanding-copyright-and-licenses/

一般来说,在 JSON 中序列化消息比 XML 更有效。我将牛顿图书馆用于商业目的有三个原因。它速度很快,具有 MIT 许可证,可通过 NuGet 获得。

在这里查看:http://json.codeplex.com

我希望这有所帮助。