【问题标题】:Wrapping XMLSerializer包装 XMLSerializer
【发布时间】:2012-04-04 02:35:07
【问题描述】:

我希望将 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。 这个问题能解决吗?

【问题讨论】:

  • 这里的场景是什么?调用者是否不知道预期的类型?
  • 我不想让调用者知道类型。你看,我试图让它看起来像二进制和 SOAP 格式化程序。调用方调用: Dim f as XMLFormatter = New XMLFormatter() 然后 f.Serialize()/Deserialize()
  • 你的意思是“像 BinaryFormatter”;存在许多以 XmlSerializer 方式工作的二进制序列化程序(即您需要知道类型),坦率地说,我支持该用例。嵌入类型是一件坏事。
  • 为什么格式化程序无法获取要序列化的对象的类型?通常当我使用 BinaryFormatter 实例时,我不必提供对象的类型。至少对于一个简单的案例。这就是我想要实现的目标。
  • 顺便说一句,如果你不关心布局是什么,你可能找到令人满意的NetDataContractSerializer'

标签: .net vb.net serialization xmlserializer facade


【解决方案1】:

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”服务
  • 没有严格的客户端/服务器关系的简单版本控制

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-13
    • 2014-11-17
    • 1970-01-01
    • 2017-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多