什么控制C#部分类的XML序列化顺序?

时间:2009-03-26 20:15:29

标签: c# sorting xsd xml-serialization partial-classes

正如Does the order of fields in C# matter?中所讨论的,可序列化属性的顺序会影响XmlSerializer输出。

但如果字段在2个文件中(使用部分类),是否有人知道实际上控制生成的顺序是什么?也就是说,哪个文件的属性是第一个?

(背景:我问这个是因为我遇到了这样一个场景,其中2个文件中的一个是从xsd自动生成的,另一个是手动编辑的。测试输出在开发人员框中与我们的脚本编译不同据推测,这是两个环境中xsd-> C#步骤的时间和历史上的几个差异的副作用。各种修复方法,但我想更好地理解编译过程如果可能的话。)

3 个答案:

答案 0 :(得分:2)

根据C#规范,没有任何保证。

答案 1 :(得分:2)

我发现使用'简单'方法通过标记它来创建一个对象[Serializable]通常只对非常简单的实现足够好。

我建议您实现IXmlSerializable接口,这非常容易,并为您提供所需的全部控制。

答案 2 :(得分:1)

以下是我们通过修复一个令人讨厌的错误所发现的:

我们遇到了完全相同的问题,我们的序列化顺序在发布后发生了变化而没有修改任何与序列化相关的类。

我们从xsd-s生成了一半的类,另一半是手工制作的。订单属性无效。我们看到的是,在发布之前,手工制作的部分部件首先被序列化,之后订单发生变化。

解决方案是项目文件中的文件的顺序,其中包含两个类。事实证明,在MSBuild(在我们的构建服务器上)构建之后,序列化器将放置前面的元素(在csproj中)" .cs"文件首先在序列化的XML中。改变" .cs"的顺序csproj中的文件交换了顺序,生成的部分在XML中根据需要预先显示。

这与上面的Eric Hirst的回答和观察是一致的,因为重命名文件会重新排序csproj的项目(它们通常按字母顺序排列)。由于这个原因,请注意手动编辑csproj。