VB.NET 4.0 DataContractJsonSerializer с измененными свойствами - PullRequest
0 голосов
/ 15 сентября 2011

У меня есть несколько объектов, сериализованных с 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 голосов
/ 15 февраля 2012

Мы нашли решение этой проблемы:

Мы перешли с DataContractJsonSerializer на JSON.Net.Проблема теперь заключалась в том, что JSON.Net сериализуется с другими соглашениями об именах, поэтому старая сериализация данных в базе данных не может быть десериализована.DataContractJsonSerializer использует «_propertyname», а JSON.Net использует «propertyname».

Но, к счастью, сериализатор JSON.Net позволил нам перезаписать Naming Generation небольшим классом:

 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...