我有一些使用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
我现在如何将“旧”字符串反序列化为新类? (新属性可以保持空白)
谢谢你!答案 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数据向我们的类添加属性。