【问题标题】:XmlSerializer not copying nested class valuesXmlSerializer 不复制嵌套类值
【发布时间】:2015-04-23 14:45:34
【问题描述】:

我正在使用 XmlSerializer 来 DeepCopy 一个对象,但不知何故它没有复制嵌套属性。

<TestClass()>
Public Class ObjectClonerTest
    ReadOnly _target As IObjectCloner = New ObjectCloner()

    <TestMethod()>
    Public Sub DeepCopy_ComplexSourceObject_NestedObjectCopied()
        Dim source As New SerialisableComplexGenericParameterHelper()
        source.Data() = 1
        source.ComplexValue.Data() = 2

        Dim actual = _target.DeepCopy(source)

        Assert.AreEqual(1, actual.Data())
        Assert.AreEqual(2, actual.ComplexValue.Data())
    End Sub

    Public Class SerialisableComplexGenericParameterHelper
        Public Property Data() As Integer
        Public ReadOnly ComplexValue As New SerialisableGenericParameterHelper()
    End Class

    Public Class SerialisableGenericParameterHelper
        Public Property Data() As Integer
    End Class

End Class

复制功能:

Public Function DeepCopy(Of T)(ByVal pSource As T) As T Implements IObjectCloner.DeepCopy
    Using memoryStream As New MemoryStream()
        Dim binaryFormatter As New XmlSerializer(GetType(T))

        binaryFormatter.Serialize(memoryStream, pSource)

        memoryStream.Position() = 0

        Return DirectCast(binaryFormatter.Deserialize(memoryStream), T)
    End Using
End Function

【问题讨论】:

    标签: vb.net xmlserializer deep-copy


    【解决方案1】:

    XmlSerializer 不序列化 ReadOnly 字段。删除 ReadOnly 解决了这个问题。

    【讨论】:

    • 当然!尽管如此,仍会将该字段提升为属性。
    • 你说的“推广领域”是什么意思?
    • 我只是想把它变成一个属性(我倾向于认为字段不如属性)。一般来说,我避免对公共字段进行编码,因为它们可能会在以后引起问题——例如,任何反映你的类的属性的东西。
    • 哦!现在很清楚了!我以为您是在说 XmlSerializer 会自动将字段转换为属性! (那会很奇怪)。该字段在这里是公开的,因为它只是一个单元测试。
    【解决方案2】:

    ComplexValue 声明为:

    Public ReadOnly ComplexValue As New SerialisableGenericParameterHelper()
    

    这不是一个属性 - 它只是一个字段。我认为解决此问题应该对其进行排序。

    【讨论】:

    • 太棒了。谢谢你。当 SO 允许时,我会接受答案。
    • 糟糕,抱歉,答案不正确,但它帮助我理解了错误。
    • 当时的错误是什么? - 最好将其包含在此处以帮助其他人。
    猜你喜欢
    • 1970-01-01
    • 2017-08-03
    • 1970-01-01
    • 1970-01-01
    • 2011-08-13
    • 2016-04-28
    • 1970-01-01
    • 2014-07-23
    • 2020-10-30
    相关资源
    最近更新 更多