包装XMLSerializer

时间:2012-03-19 15:31:42

标签: .net vb.net serialization xmlserializer facade

我希望将XMLSerializer放在我的'facade'类之后,以便用户不必向构造函数提供类型信息。但这样做有一个问题。考虑这个课程:

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的情况下不能使用反序列化,因为XMLSerializer实例是在Serialize中创建的并且是共享的。但是在没有这个实例的情况下使用Deserialize将只返回Nothing。 这个问题可以解决吗?

1 个答案:

答案 0 :(得分: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”服务
  • 没有严格的客户/服务器联系的简单版本

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