I try to deserialize a custom collection using Newtonsoft.net.
Public Class ObservableCollectionAdvanced(Of T As INotifyPropertyChanged)
Implements IEnumerable(Of T)
Implements INotifyPropertyChanged
Implements INotifyCollectionChanged
Implements INotifyCollectionItemPropertyChanged
Private ReadOnly _collection As New ObservableCollection(Of T)
Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged
Public Event CollectionChanged As NotifyCollectionChangedEventHandler Implements INotifyCollectionChanged.CollectionChanged
Public Event CollectionItemPropertyChanged As PropertyChangedEventHandler Implements INotifyCollectionItemPropertyChanged.CollectionItemPropertyChanged
Public Sub New()
AddHandler _collection.CollectionChanged, Sub(sender As Object, e As NotifyCollectionChangedEventArgs)
RaiseEvent CollectionChanged(Me, e)
End Sub
End Sub
Default Public ReadOnly Property Item(Index As Integer) As T
Get
If Index >= 0 AndAlso Index < _collection.Count Then
Return _collection(Index)
Else
Return Nothing
End If
End Get
End Property
Public Sub Add(Item As T)
If Item IsNot Nothing Then
Me.AddHandlerToItem(Item)
_collection.Add(Item)
End If
End Sub
Private Sub AddHandlerToItem(Item As T)
If Not TypeOf Item Is INotifyPropertyChanged Then Exit Sub
AddHandler DirectCast(Item, INotifyPropertyChanged).PropertyChanged, AddressOf Item_PropertyChanged
End Sub
Private Sub Item_PropertyChanged(sender As Object, e As PropertyChangedEventArgs)
RaiseEvent CollectionItemPropertyChanged(sender, e)
End Sub
Public Function GetEnumerator() As IEnumerator(Of T) Implements IEnumerable(Of T).GetEnumerator
Return _collection.GetEnumerator()
End Function
Private Function GetEnumerator1() As IEnumerator Implements IEnumerable.GetEnumerator
Return Me.GetEnumerator()
End Function
End Class
This is my implementation. While deserializing I get en Exception. "Cannot create and populate list type". I've tried a ObservableCollection instead, without any exceptions.
Dim devices As New ObservableCollectionAdvanced(Of IDevice)
devices.add(new TorsionArmDevice())
Dim JsonString as string = JsonConvert.SerializeObject(devices, Newtonsoft.Json.Formatting.Indented, New JsonSerializerSettings With {.TypeNameHandling = TypeNameHandling.All})
Newtonsoft.Json.JsonConvert.DeserializeObject(of ObservableCollectionAdvanced(Of IDevice))(JsonString, New JsonSerializerSettings With {.TypeNameHandling = TypeNameHandling.All})
Demo fiddle here.