从 XML 反序列化时忽略构造函数

Ignore constructor on deserialize from XML

提问人:gegy 提问时间:9/6/2023 更新时间:9/6/2023 访问量:33

问:

我有一个带有List(of SomeKindOfObjects)的类。在构造函数中,我对列表应用了几个实例,以预设列表以供首次使用。用户可以在 UI 中修改列表。例如,用户清除 then 列表中的所有元素,使其为空。之后,带有列表的类被序列化为 XML。 稍后,当我将 XML 反序列化为类时,将调用构造函数,并用“默认”值再次填充列表,但它应该是空的。

以下是我的课程:


Imports System.ComponentModel

Public Class ArticleAndBOMExportEntrySettings
    Implements INotifyPropertyChanged

    Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged
    Protected Sub OnPropertyChanged(ByVal e As PropertyChangedEventArgs)
        RaiseEvent PropertyChanged(Me, e)
    End Sub

    Sub New()
        Me.ExtensionsArticle = New List(Of DocumentType)({New DocumentType() With {
            .Documenttype = DocumentType.EDocumentType.a,
            .Extension = $".{DocumentType.EDocumentType.a}",
            .Name = DocumentType.EDocumentType.a.ToString.ToUpper},
            New DocumentType() With {
            .Documenttype = DocumentType.EDocumentType.a,
            .Extension = $".{DocumentType.EDocumentType.a}",
            .Name = DocumentType.EDocumentType.a.ToString.ToUpper}})

        Me.DbUserArticle = "Test"
    End Sub

    'This is set on deserialze
    Public Property DbUserArticle As String = ""

    'This has always the value set from the constructor, also after deserialize from XML Why?
    Public Property ExtensionsArticle As List(Of DocumentType)

End Class



<Serializable>
Public Class DocumentType
    Implements IEquatable(Of DocumentType)

    Enum EDocumentType
        a
        b
        c
    End Enum
    <Browsable(False)>
    Property Documenttype As EDocumentType = EDocumentType.a

    Public Property Name As String = ""

    <Browsable(False)>
    Property Extension As String = $".{Documenttype}"

    Public Shadows Function Equals(other As DocumentType) As Boolean Implements IEquatable(Of DocumentType).Equals
        Return Me.Name = other.Name
    End Function
End Class

当xml从XML反序列化时,如何忽略构造函数? 奇怪的是:其他属性是从XML中设置的,而不是从列表中设置的。如果我不从构造函数中初始化列表属性,则一切正常。

XML vb.net 构造函数 反序列化

评论

1赞 djv 9/6/2023
XmlSerializer 需要一个无参数构造函数,该构造函数在反序列化时始终调用。也许您可以清空构造函数,并将初始化放在您在需要时调用的单独方法中
0赞 gegy 9/6/2023
是的,你是对的,需要一个无参数的构造函数。我尝试使用autosetproperty设置属性,但结果是一样的。当然,我可以找到一种方法来设置属性。我会寻找这样的解决方案。但是,为什么它适用于其他属性,而不适用于列表属性。在这种情况下,问题是什么?
0赞 gegy 9/6/2023
顺便说一句,我会说上面代码中的构造函数是无参数的。;)
0赞 djv 9/6/2023
是的。它会自动调用,这似乎是您的问题。您可以从其中删除代码并放入一个方法
0赞 gegy 9/6/2023
但是当我从反序列化设置的值时?如果在反序列化后调用它,则 DbUserArticle 属性的值也应被覆盖,但事实并非如此。

答: 暂无答案