2011-09-15 24 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

私たちは、この問題の解決策を見つけた:

我々はJSON.NetにDataContractJsonSerializerから切り替えます。 問題は今、JSON.Netが異なる命名規則でシリアル化するため、古いものがデータベース内のデータを直列化解除できないということでした。 DataContractJsonSerializerは "_propertyname"を使用し、JSON.Netは "propertyname"を使用します。

しかしfortunalety JSON.Netシリアライザは、私たちは小さなクラスとネーミングの生成を上書きすることができ:これは古いJSONデータとした使用することができ

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 

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

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

ここで、私たちはより多くの欠陥のある通行料を持っています古いJSONデータを使用してクラスにプロパティを追加することができます。

関連する問題