Самый простой способ объяснить эту проблему - показать вам код:
Public Interface IAmAnnoyed
End Interface
Public Class IAmAnnoyedCollection
Inherits ObjectModel.Collection(Of IAmAnnoyed)
End Class
Public Class Anger
Implements IAmAnnoyed
End Class
Public Class MyButton
Inherits Button
Private _Annoyance As IAmAnnoyedCollection
<DesignerSerializationVisibility(DesignerSerializationVisibility.Content)> _
Public ReadOnly Property Annoyance() As IAmAnnoyedCollection
Get
Return _Annoyance
End Get
End Property
Private _InternalAnger As Anger
<DesignerSerializationVisibility(DesignerSerializationVisibility.Content)> _
Public ReadOnly Property InternalAnger() As Anger
Get
Return Me._InternalAnger
End Get
End Property
Public Sub New()
Me._Annoyance = New IAmAnnoyedCollection
Me._InternalAnger = New Anger
Me._Annoyance.Add(Me._InternalAnger)
End Sub
End Class
И вот код, который генерирует дизайнер:
Private Sub InitializeComponent()
Dim Anger1 As Anger = New Anger
Me.MyButton1 = New MyButton
'
'MyButton1
'
Me.MyButton1.Annoyance.Add(Anger1)
// Should be: Me.MyButton1.Annoyance.Add(Me.MyButton1.InternalAnger)
'
'Form1
'
Me.Controls.Add(Me.MyButton1)
End Sub
Я добавил комментарий к вышесказанному, чтобы показать, как должен был генерироваться код. Теперь, если я обойдусь без интерфейса и просто получу коллекцию Anger, он будет сохранен правильно.
Есть идеи?
Обновление 1
Мне это надоело. Эта проблема была связана с сохранением коллекции интерфейсов, но теперь при дальнейшем тестировании она не работает для обычной коллекции. Вот еще один простой код:
Public Class Anger
End Class
Public Class MyButton
Inherits Button
Private _Annoyance As List(Of Anger)
<DesignerSerializationVisibility(DesignerSerializationVisibility.Content)> _
Public ReadOnly Property Annoyance() As List(Of Anger)
Get
Return _Annoyance
End Get
End Property
Private _InternalAnger As Anger
<DesignerSerializationVisibility(DesignerSerializationVisibility.Content)> _
Public ReadOnly Property InternalAnger() As Anger
Get
Return Me._InternalAnger
End Get
End Property
Public Sub New()
Me._Annoyance = New List(Of Anger)
Me._InternalAnger = New Anger
Me._Annoyance.Add(Me._InternalAnger)
End Sub
End Class
Дизайнер испортил постоянный код так же, как исходная проблема.
Обновление 2
Я выяснил, что происходит. Я задавался вопросом, почему иногда это работает, а не другие. Это сводится к имени, которое я даю внутреннему свойству и коллекции.
Если я переименую свойство «Раздражение» в «WTF», оно будет правильно сериализовано, поскольку «WTF» в алфавитном порядке после имени коллекции - «InternalAnger».
Похоже, что сериализатор создает экземпляры объектов в алфавитном порядке и требует, чтобы мое внутреннее свойство было создано к моменту создания коллекции.
Я могу исправить это с помощью переименования, но это хак, и я боюсь, что написание собственного сериализатора - большая работа, которой я никогда раньше не делал.
Есть идеи?
Обновление 3
Я ответил на вопрос взломом. Я вполне уверен в этом, если MS не изменит способ кодирования, сериализующий код конструктора.