【问题标题】:DataMember ignored when serializing to JSON序列化为 JSON 时忽略 DataMember
【发布时间】:2016-04-25 16:29:19
【问题描述】:

我已将 DataMemeber 添加到我的对象属性中以在序列化为 JSON 时更改设置,但它没有使用它们。我试图更改名称,以及发出默认值。

我尝试这样做的原因是,如果某个属性处于默认值,我想忽略它。

我正在尝试使用 Microsoft 库而不是 Newtonsoft 库。

    <DataMember(EmitDefaultValue:=True, IsRequired:=False, Name:="addressTable")> Public Property addressTable() As String
        Get
            Return _AddressTable
        End Get
        Set(ByVal value As String)
            _AddressTable = value
        End Set
    End Property


Public Function gObjToStr(ByVal InputObject As Object) As String

    Dim stream1 As New IO.MemoryStream
    Dim ser As Runtime.Serialization.Json.DataContractJsonSerializer = New Runtime.Serialization.Json.DataContractJsonSerializer(InputObject.GetType)

    ser.WriteObject(stream1, InputObject)
    stream1.Position = 0

    Dim sr As New IO.StreamReader(stream1)
    Dim OutString As String = Nothing

    Return sr.ReadToEnd

End Function

【问题讨论】:

  • 你也可以发布序列化的代码还是你在使用WCF?
  • 已更新序列化代码

标签: json vb.net serialization datacontractjsonserializer


【解决方案1】:

您需要从属性addressTable 中删除EmitDefaultValue 属性。

基本上,EmitDefaultValue 告诉序列化引擎是否序列化正在序列化的字段或属性的默认值

EmitDefaultValue 的默认值为 true,因此即使属性具有默认值,它也会被序列化。根据您的要求,如果您需要忽略某个属性,如果它具有默认值,那么您需要将属性EmitDefaultValue 添加到属性并将值设置为 false,[DataMember(EmitDefaultValue =false)]。在上面发布的代码中,您设置了EmitDefaultValue = true,因此它在序列化中生成addressTable

另外,IsRequired 指示序列化引擎在读取或反序列化时该成员必须存在。所以你应该小心使用EmitDefaultValueIsRequired这两个属性。 IsRequired = false 的默认值。所以你不能有EmitDefaultValue=falseIsRequired=true这样的组合,在这种情况下序列化引擎会抛出异常。

【讨论】:

  • 我把 Emit 当作 Omit 对待.....我想我需要一个假期。谢谢你的工作。
  • 只有将&lt;Runtime.Serialization.DataContract&gt;添加到类本身时才有效
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-04
  • 1970-01-01
  • 2011-04-13
  • 1970-01-01
相关资源
最近更新 更多