Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# XML序列化的替代_C#_Xml_Xml Serialization - Fatal编程技术网

C# XML序列化的替代

C# XML序列化的替代,c#,xml,xml-serialization,C#,Xml,Xml Serialization,我使用XmlSerializer对数据结构进行序列化/反序列化以实现持久性。我在StackOverflow上的几个地方读到并听说,XmlSerializer是一个或多个: 坏的 支持/实施不力 将来可能不会得到支持 我的问题有两个方面;上述情况是否属实,如果属实,还有哪些替代方案?就我而言,XML工作得非常好,我希望保持这一点不变,但其他一切都可以更改 编辑:如果您想对XML提出其他建议,我愿意接受,但它确实需要可读性。如果您可以使用.Net 3.5(最好是SP1),我会研究。尽管它的可配置

我使用
XmlSerializer
对数据结构进行序列化/反序列化以实现持久性。我在StackOverflow上的几个地方读到并听说,
XmlSerializer
是一个或多个:

  • 坏的
  • 支持/实施不力
  • 将来可能不会得到支持
我的问题有两个方面;上述情况是否属实,如果属实,还有哪些替代方案?就我而言,XML工作得非常好,我希望保持这一点不变,但其他一切都可以更改

编辑:如果您想对XML提出其他建议,我愿意接受,但它确实需要可读性。

如果您可以使用.Net 3.5(最好是SP1),我会研究。尽管它的可配置性不如XmlSerializer,但它更快、更易于使用(至少在我的经验中是这样),并且更易于移植(即用于web服务)。SP1将其默认行为更改为opt-out,因此您可以序列化任何类,而无需对需要序列化的所有对象明确定义属性


我建议在作为一种改变进行投资之前,彻底阅读关于它的文档。根据序列化的自定义程度,它可能不适合您。

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

  • 相对缓慢;但通常这仍然足够快
  • 只支持公众成员;可能是一种痛苦
  • 需要写入访问器列表-非常难看
然而,我预计它将在相当长的一段时间内继续存在;在我看来,真正有问题的是
BinaryFormatter
(用于持久化时)


我很有偏见(因为我是作者),但我会选择;使用谷歌“协议缓冲区”有线格式的二进制序列化程序;语言/平台之间的快速、可移植、输出非常小、版本容忍等(当然是免费的)。不过,显然不是xml,因此不便于人类阅读。

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


对于XML序列化程序,有“支持的”,也有“支持的”

越来越多的关于XML序列化程序的Connect bug报告回来确认bug,并声明这些bug不会被修复


我确信,如果您在XML序列化程序中遇到了一个安全性关键的bug,它将得到修复。但是,我认为不太可能修复其他不那么关键的bug。

我将采用另一种观点:
XmlSerializer是受支持的,其行为是已知的,并且工作良好。这并不“坏”。它非常通用,有很好的文档记录,有很多例子。性能可能非常适合您的需要。它可能满足你的需要

有些人有特殊的需求,但XmlSerializer没有解决这些需求。从这些需求中,我们可以得到protobufs、DataContractSerializer和其他选项

但是XmlSerializer仍然非常通用,并且可能是城里应用最广泛的序列化程序。这可能仍然是序列化内容最安全的方法


至于支持…
微软可能正在放慢修复bug的速度。我将其与WinForms进行比较。WinForms不再是Microsoft推出的主要UI框架。但它仍然成熟,运作良好,表现良好。XmlSerializer是相同的

至于对未来的支持。微软有一个5+5支持政策-他们在产品发布后支持5年,然后你可以为它购买5年的额外支持。NET框架不是受支持的“东西”-受支持的是包含.NET的Windows操作系统。Windows 7将包括.NET 3.5(我认为版本是3.5?),因此.NET 3.5中的所有内容,包括WinForms和XmlSerializer,将在10月或Win7发布时再“正式支持”5年。如果是.NET4.0,那么4.0中的任何内容(仍然包括WinForms和XmlSerializer)都将支持5年。每当.NET附带新产品时,5年时钟就会重新启动

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

就官方支持而言,你没有什么可担心的。这不是你所说的开源项目。这不是像WSE或SOAP工具包那样的权宜之计


诚然,支持的程度是不同的,随着新的.NET API的发布和推广,旧的.NET API的优先级会降低。但是,到它们稳定下来的时候,年长的物种可能会更稳定。你完全安全

以下是一个替代XmlSerializer的库:


除了将一些类纯粹作为包装器类型的类,我所做的
XmlSerializer
没有什么特别之处。没有覆盖或类似的东西。Marc,是否(轻松地)可以用protobuf net替换默认的BinaryFormatter以与.net远程处理一起使用?我不需要XML(虽然,这样做很好,不会破坏现有安装),但我需要人可读的。不过,感谢您列出的缺点。对于远程处理,您可以通过protobuf net在每个对象大约4行代码中实现
ISerializable
;大概是我能得到的最好的。。。这仅对“根”对象(不是封装的对象)是必需的。为了让人可读。。。也许JSON.Net?JSON是一个有趣的建议,我甚至没有想到。。。我会调查的,干杯。注意这只是一个“考虑”。如果您的xml目前可以工作,那么就没有理由更改任何内容。@Cheeso:您知道bug的速度吗