具有已更改属性的VB.NET 4.0 DataContractJsonSerializer

时间:2011-09-15 12:42:16

标签: asp.net vb.net json serialization

我有一些使用System.Runtime.Serialization.Json.DataContractJsonSerializer序列化的对象并写入我的数据库:

Dim serializer = New DataContractJsonSerializer(obj.GetType)
Using ms = New MemoryStream()
    serializer.WriteObject(ms, obj)
    ms.Position = 0
    Using sr = New StreamReader(ms)
        Dim json = sr.ReadToEnd()
        sr.Close()
        Return json
    End Using
End Using

现在我必须更改类并添加一些新属性。

然后我想将“旧”字符串反序列化为新类:

Using ms = New MemoryStream(Encoding.UTF8.GetBytes(serialized))
    Dim ser = New DataContractJsonSerializer(GetType(T))
    Return DirectCast(ser.ReadObject(ms), T)
End Using

我现在如何将“旧”字符串反序列化为新类? (新属性可以保持空白)

谢谢你!

1 个答案:

答案 0 :(得分:0)

我们找到了解决此问题的方法:

我们从DataContractJsonSerializer切换到JSON.Net。 现在的问题是,JSON.Net使用不同的命名约定进行序列化,因此无法对数据库中的旧序列化数据进行反序列化。 DataContractJsonSerializer使用“_propertyname”,而JSON.Net使用“propertyname”。

但幸运的是,JSON.Net Serializer允许我们用一个小类来覆盖命名生成:

 Public Class UnderscorePropertyNamesContractResolver
    Inherits Newtonsoft.Json.Serialization.DefaultContractResolver

    Protected Overrides Function ResolvePropertyName(propertyName As String) As String
        Return MyBase.ResolvePropertyName("_" + propertyName)
    End Function
End Class

然后可以使用旧的JSON数据:

 Dim Setting = New JsonSerializerSettings
 Setting.ContractResolver = New UnderscorePropertyNamesContractResolver
 return JsonConvert.DeserializeObject(Of T)(serialized, Setting)

用这个来做Seralisation:

Dim Setting = New JsonSerializerSettings
Setting.ContractResolver = New UnderscorePropertyNamesContractResolver
return JsonConvert.SerializeObject(obj, Formatting.Indented, Setting)

现在我们有了更多的容错JSON序列化错误,并且可以使用旧的JSON数据向我们的类添加属性。