|
|
|
|
Автор:
|
Руслан
|
|
Тема:
|
Complex object serialization
|
|
Дата:
|
1/17/2002 10:50:00 AM
|
Вопрос: Как сериализовать класс, который имплементирует интерфейсы: IEnumerable, IEnumerator ?
При сериализации вылетает следующее:
Error:
An unhandled exception of type 'System.InvalidOperationException' occurred in system.xml.dll
Additional information: You must implement the Add(System.Object) method on MySerialization.MyNamespace.GridColumns because it inherits from IEnumerable.
Но ведь в интерфейсе IEnumerable нет метода Add(System.Object) !!!
Код:
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim tGrid As New MyNamespace.MyGrid()
tGrid.Name = "GridName"
tGrid.Caption = "GridCaption"
tGrid.Columns.Attribute1 = "a111"
tGrid.Columns.Attribute2 = "a222"
tGrid.Columns.Attribute3 = "a333"
Dim tColumn As MyNamespace.GridColumn
tColumn = New MyNamespace.GridColumn()
tColumn.ColumnID = 1
tColumn.ColumnCaption = "First"
tGrid.Columns.Add(tColumn)
tColumn = New MyNamespace.GridColumn()
tColumn.ColumnID = 2
tColumn.ColumnCaption = "Second"
tGrid.Columns.Add(tColumn)
tColumn = New MyNamespace.GridColumn()
tColumn.ColumnID = 3
tColumn.ColumnCaption = "Third"
tGrid.Columns.Add(tColumn)
Dim tExtraTypes(1) As Type
tExtraTypes(0) = GetType(MyNamespace.GridColumn)
tExtraTypes(1) = GetType(MyNamespace.GridColumns)
Dim xs As System.Xml.Serialization.XmlSerializer
xs = New System.Xml.Serialization.XmlSerializer(tGrid.GetType, tExtraTypes) ' Error raised here.............
End Sub
Namespace MyNamespace
Public Class MyGrid
Public Name As String
Public Caption As String
Public Columns As GridColumns
Public Sub New()
Columns = New GridColumns()
End Sub
Protected Overrides Sub Finalize()
Columns = Nothing
End Sub
End Class
Public Class GridColumns
Implements IEnumerable, IEnumerator
Public Attribute1 As String
Public Attribute2 As String
Public Attribute3 As String
Private pColumns As Collection
Private tCurrent As Integer
ReadOnly Property Count()
Get
Count = pColumns.Count
End Get
End Property
Public ReadOnly Property Current() As Object Implements System.Collections.IEnumerator.Current
Get
Return pColumns(tCurrent)
End Get
End Property
Public Function MoveNext() As Boolean Implements System.Collections.IEnumerator.MoveNext
If tCurrent < Me.Count Then
tCurrent = tCurrent + 1
End If
End Function
Public Sub Reset() Implements System.Collections.IEnumerator.Reset
tCurrent = 0
End Sub
Public Sub New()
pColumns = New Collection()
End Sub
Protected Overrides Sub Finalize()
pColumns = Nothing
MyBase.Finalize()
End Sub
Default ReadOnly Property Item(ByVal rID As String) As GridColumn
Get
Return pColumns(rID)
End Get
End Property
Public Function Add(ByRef rItem As GridColumn) As Boolean
pColumns.Add(rItem, rItem.ColumnID)
End Function
Public Function GetEnumerator() As System.Collections.IEnumerator Implements System.Collections.IEnumerable.GetEnumerator
Return pColumns.GetEnumerator()
End Function
End Class
Public Class GridColumn
Public ColumnID As Integer
Public ColumnCaption As String
Public Sub New()
End Sub
End Class
End Namespace
Any suggestions ?
|
|
|
|