1

我希望将 XMLSerializer 放在我的“外观”类后面,这样用户就不必向构造函数提供类型信息。但是这样做是有问题的。考虑这个类:

Class XmlFormatter
    Private Shared xs As XmlSerializer

    Public Function Deserialize(ByVal serializationStream As Stream) As Object
        Dim o As Object = Nothing
        If Not xs Is Nothing Then
            o = xs.Deserialize(serializationStream)
        End If
        Return o
    End Function

    Public Overloads Sub Serialize(ByVal serializationStream As Stream, ByVal graph As Object)
        If xs Is Nothing Then
            xs = New XmlSerializer(graph.GetType())
        End If
        xs.Serialize(serializationStream, graph)
    End Sub
End Class

问题是这个类的用户不能在没有首先使用 Serialize 的情况下使用 Deserialize,因为 XMLSerializer 实例是在 Serialize 中创建的并且是共享的。但是在没有这个实例的情况下使用 Deserialize 只会返回 Nothing。这个问题能解决吗?

4

1 回答 1

0

XmlSerializer 不包括类型,因为类型不重要是XmlSerializer 的设计决定。以下是 100% 兼容的,例如:

namespace X {
    public class A {
        public string B;
    }
}
namespace Y.Z {
    [XmlRoot("A"), XmlType("A")]
    public class C {
        [XmlElement("B")]
        public string D {get;set;}
    }
}

这是 IMO 最有用的方法,并允许:

  • 简单使用生成/代理类型
  • 在 POCO/DTO 之间切换
  • 跨平台和跨架构使用(例如使用来自 WP7/SL/XNA 的“完整 .NET”服务
  • 没有严格的客户端/服务器关系的简单版本控制

基本上,我认为客户绝对应该知道它的期望,并且依赖类型是错误的方法。

于 2012-03-19T16:36:23.880 回答