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

时间:2013-10-24 13:55:49

标签: c# .net json serialization protocol-buffers

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

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

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

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

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

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

提前致谢

2 个答案:

答案 0 :(得分:2)

就个人而言,我建议不要考虑“表格”的序列化。而不是像同类型实体列表那样的事情。您以后可以随时向这些实体添加成员(大多数序列化程序都可以正常使用)。在最小开销和开放许可方面,我谦卑地认为protobuf-net是一个合理的选择 - 它是google的“协议缓冲区”规范的一种实现,旨在提高线路效率和版本容忍度(特别是在添加成员时) )。这会留下压力;现在:因为有线格式已经非常简洁(它是一种密集的二进制格式,只使用字段标识符的数字而不是名称),它实际上并不包含任何“压缩”;然而,如果你的数据由文本(长描述等)控制,那么是:它仍然可以削减一些字节 - 但你可以通过将序列化和压缩视为单独来实现这一点 - 而且只是通过像GZipStream之类的东西来运行它。由于.NET中的Stream可以充当装饰器,因此通常是微不足道的,即

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

答案 1 :(得分:1)

JulienVan,

在查看商业用途的软件许可证时,我的公司倾向于支持麻省理工学院和BSD。这些许可证允许商业使用和分发,没有太多限制。

有许多许可指南,这里有一个我认为合适的: http://www.smashingmagazine.com/2011/06/14/understanding-copyright-and-licenses/

一般来说,使用JSON序列化消息比XML更有效。出于三个原因,我将Newton库用于商业用途。它很快,拥有MIT许可证,可从via NuGet获得。

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

我希望有所帮助。