替换XML序列化

我有使用XmlSerializer代码来序列化/反序列化数据结构以保持持久性。 我在StackOverflow上的几个地方读过和听说XmlSerializer是以下一个或多个:

  • 支持/实施不力
  • 可能不会支持未来

我的问题是双重的; 以上是否属实,若有,有哪些替代方案? 就我的目的而言,XML工作得非常好,我希望保持这种不变,但其他一切都是可以改变的。

编辑:如果你想建议XML的其他东西,我会接受它,但它确实需要人类可读。

XmlSerializer完全可以支持,但有一些故障;

  • 比较慢; 但通常这仍然足够快
  • 只支持公众成员; 可能是一种痛苦
  • 需要写访问者列表 – 只是丑陋

但是,我预计它将继续存在相当长的一段时间; IMO,它是BinaryFormatter ,它有真正的问题(当用于持久性时)。

我很偏颇(因为我是作者),但我会选择protobuf-net ; 使用谷歌“协议缓冲”有线格式的二进制序列化器; 快速,可在语言/平台之间移植,输出非常小,版本容忍等(当然也是免费的)。 显然不是xml,所以不是人类可读的。

就XML Serializer而言,它是“支持的”,并且“支持”。

关于XML Serializer的越来越多的Connect错误报告正在回来确认错误,并声明错误将不会被修复。

我敢肯定,如果您遇到XML Serializer中的安全关键错误,它将被修复。 但是,我认为不太可能修复其他不那么重要的错误。

如果你可以使用.Net 3.5(最好是SP1),我会查看DataContractSerializer 。 虽然它比XmlSerializer更不易配置,但它更快,更容易使用(至少在我的经验中)和更便携(即用于Web服务)。 SP1将其默认行为更改为选择退出,因此您可以序列化任何类,而无需在序列化所需的所有内容上明确定义属性。

我建议在投资之前仔细阅读相关文档作为更改。 根据您的序列化的自定义方式,它可能不适合您。

jSON比XML快得多。 您可以使用Json.NET来读取它。 它具有内置的序列化。

http://james.newtonking.com/pages/json-net.aspx

我将采取另一种观点:
支持XmlSerializer,其行为已知,并且运行良好。 这不是“坏事”。 它非常通用,文档齐全,有很多例子。 性能可能非常适合您的需求。 它可能会满足您的需求。

有些人有特殊需求,而XmlSerializer没有解决这些需求。 根据这些要求,我们可以获得protobufs,DataContractSerializer和其他选项。

但XmlSerializer仍然是非常通用的,可能是城里最广泛适用的序列化器。 它仍然是序列化内容最安全的选择。


至于支持……
MS可能会因修复错误而放慢速度。 我将此与WinForms进行比较。 WinForms不再是微软推出的主要UI框架。 但它仍然成熟,运作良好,表现良好。 XmlSerializer是一样的。

至于对未来的支持。 MS有5 + 5支持政策 – 它们在发布后支持产品5年,然后您可以购买5年的额外支持。 .NET Framework不是受支持的“东西” – 它是支持.NET的Windows操作系统。 Windows 7将包括.NET 3.5(我认为版本是3.5?)所以.NET 3.5中的所有东西,包括WinForms和XmlSerializer,将在10月或Win7发布时“正式支持”5年。 如果它是.NET 4.0,那么4.0中的任何东西(包括,仍然是WinForms和XmlSerializer)都将支持5年。 每次新产品附带.NET时,5年时钟都会重新启动。

看看VB6 Runtime,它最初是在1998年随Visual Studio 6一起发布的。从那时起它就被包含在Windows中,包括今年发布的Windows Server 2008 R2。 因此,至少到2014年,VB运行时将得到支持。至少这是16年的主流支持。

官方支持而言,你没有什么可担心的。 这不是您正在谈论的开源项目。 这不是像WSE或SOAP Toolkit那样的权宜之计。

确实存在一定程度的支持,并且随着较新的.NET API的推出和推广,较旧的.NET API会优先减少。 但是,当它们处于高原时,较旧的那些可能更稳定。 你完全安全。

这是一个替换XmlSerializer的库:

http://www.sharpserializer.com/en/index.html