2011-09-15 51 views
0

我有一些與System.Runtime.Serialization.Json.DataContractJsonSerializer序列,並寫入我的數據庫對象:VB.NET 4.0 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

我們發現這個問題的解決方案:

我們從DataContractJsonSerializer到JSON.Net切換。 現在的問題是,JSON.Net使用不同的命名約定進行序列化,所以舊的序列化數據庫中的數據無法反序列化。 DataContractJsonSerializer使用「_propertyname」,並且JSON.Net使用「propertyname」。

但fortunalety的JSON.Net串行允許我們用小類覆蓋命名生成:

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) 

現在我們有更多故障收費erant JSON序列化,並可以使用舊的JSON數據將屬性添加到我們的類。

相關問題