2017-08-31 39 views
0

我最近的一些序列化类已经工作,他们通常是这个样子:为什么要在“DataMember”上指定“Order”?

[DataContract] 
public class Foo 
{ 
    [DataMember(Order = 0)] 
    public string Bar1 
    { 
     get; 
     set; 
    } 

    [DataMember(Order = 1)] 
    public string Bar2 
    { 
     get; 
     set; 
    } 
} 

我在想,一个能有什么可能的应用用于指定数据成员的订单?指导here指定它可能“有时可能需要更改此顺序。”但不要举例说明什么时候或为什么。你有什么时候或为什么这可能是必要的例子吗?

在我的应用程序中,我简单地序列化这些类型的这些对象并将它们保存到文件中。在这里指定“订单”是否有任何价值,或者是否只是添加其他内容来维护?如果我只是从每个数据成员中删除“订单”,我是否会遇到任何问题?

+1

如果删除命令,它会使用默认的顺序(按字母顺序排列)。在你的例子中,显式顺序已经是按字母顺序排列的,所以它没有关系,但是如果你的显式顺序不是按字母顺序排列的,那么移除顺序属性会改变序列化顺序并破坏现有客户端。通常Order用于将与DataContract的不同版本对应的成员分组。 – Joe

+0

我认为这就是我在寻找@Joe的答案。是否将与不同版本对应的成员分组在一起处理不同版本的数据合同的标准方法? – luxun

+1

它在Microsoft最佳实践文档中提到:请参阅https://docs.microsoft.com/en-us/dotnet/framework/wcf/best-practices-data-data中的“不需要架构验证时的版本控制”一节中的8c-合同版本 – Joe

回答

1

Order指定顺序,其中数据成员序列化为对象,否则将按字母顺序排列。

在一些应用中,有用的是知道在哪个从各种数据成员的数据 被发送或预计要接收的 (如其中数据将出现在序列化的XML的顺序)的顺序。

当您要向具有预定义对象结构的客户端发送响应时,您想要订购数据成员的场景之一。

例如,请参阅question

有时您可能会首先显示ID字段(或类似字段),然后是所有其他字段,以使raw xml看起来最终用户友好。

是的,如果你没有提到顺序,你不会得到任何错误。

参考文档here

+0

我明白,但我问**为什么**你想要指定一个订单? – luxun

+0

这取决于用例请参考更新的答案 – Winnie

+0

用例的例子是您要指定订单的地方? – luxun

相关问题