【发布时间】: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