我希望将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。 这个问题可以解决吗?
答案 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最有用的方法,并允许:
基本上,我认为客户绝对应该知道它的期望,并且依赖于这种类型是错误的方法。