【问题标题】:Serialization of Version type different per project?每个项目的版本类型序列化不同?
【发布时间】:2018-06-12 18:28:55
【问题描述】:

我有一个 Version 字段,它是数据合同的一部分,如下所示:

[DataMember(EmitDefaultValue = false)]
public Version version { get; set; }

在 REST 请求中,最终被序列化为

"version": {
    "_Build": 0,
    "_Major": 1,
    "_Minor": 0,
    "_Revision": 0
}

这对我来说很好。但是,我启动了一个新项目,将该项目添加为引用,然后当我尝试从新项目发送 REST 请求时,它被序列化为

"version":{
    "Major":1,
    "Minor":0,
    "Build":0,
    "Revision":-1,
    "MajorRevision":-1,
    "MinorRevision":-1
}

当然,这让我收到了 BAD_REQUEST。注意:我在这里担心不同的字段名称,而不是实际数字。我在两者中都使用了相同的 Version 类型。

【问题讨论】:

    标签: c# wcf


    【解决方案1】:

    修订值中的负数 (-1) 确实意味着修订号未定义。

    在下面的链接中查找 (-1)。

    https://msdn.microsoft.com/en-us/library/system.version.revision(v=vs.110).aspx

    并且属性EmitDefaultValue=false 将只对默认值起作用(是否序列化默认值)。

    在您的情况下,“-1”不是整数类型(修订数据类型)的默认值。为零。

    可能是为了处理这种情况,使用OnSerializing()属性并自定义数据成员。

    大概,

    函数从 (https://msdn.microsoft.com/en-us/library/system.runtime.serialization.onserializingattribute(v=vs.110).aspx) 提升

    [OnSerializing()]
    internal void OnSerializingMethod(StreamingContext context)
    {
       if (this.version.Revision == -1)
       {
          //handle it properly 
    
          or
    
          this.version.Revision = default(int)// will not be serialized as you are using "EmitDefaultValue=false"
       }
    }
    

    【讨论】:

    • 我担心的不是数字,而是字段名。我的问题是,即使来自同一个地方,相同的类型也会在两个不同的项目中以两种不同的方式进行序列化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-02
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多