我有2个班级:
公共类ClassA
公共类ClassB(来自另一个名称空间):ClassA
我在ClassA使用方法
public static ClassA Deserialize(string path)
{
ClassA classA;
//classA=code...
return classA;
}
我在classB
调用此方法public void DoSomething()
{
ClassB classB=(ClassB)ClassA.Deserialize("c:\directory\file.xml);
}
方法反序列化有效,但是我得到的错误是将ClassA强制转换为ClassB。
如何处理?
public static ClassA DeserializeFromXml(string path)
{
XmlSerializer s = new XmlSerializer(typeof(ClassA));
ClaasA h;
TextReader r = new StreamReader(path);
h = (ClassA)s.Deserialize(r);
r.Close();
return h;
}
也许有反序列化的东西(字符串路径,类型objectType)??
如果有必要,我可以更改方法反序列化
答案 0 :(得分:6)
不是 a B. B 是A
(ClassB)something_that_is_A除非是B或其衍生物,否则无法完成。
答案 1 :(得分:2)
如果没有显示您的Deserialize
代码,很难说明发生了什么。这可能是问题的核心 - 如果您希望能够将结果转换为{{1},则需要使Deserialize
实际创建ClassB
(或派生类)的实例}}。如果您的ClassB
方法创建了Deserialize
的实例,然后设置了一堆属性,那么您需要更改它,或者稍后找到另一种创建ClassA
实例的方法。
如果值是对ClassB
的实际实例的引用,则只能将表达式转换为ClassB
。如果该对象只是ClassB
的一个实例,那么您将无法进行投射 - 您希望ClassA
中的任何额外字段等会发生什么?除非用户定义的转换,为参考类型转换仅执行引用转换,否则它不会创建新对象。 (有关详细信息,请参阅Eric Lippert's blog post on representation and identity。)
答案 2 :(得分:1)
您的方法返回一个void,因此您尝试将void的返回转换为ClassB。
答案 3 :(得分:0)
从ClassB
继承ClassA
不允许将ClassA
对象强制转换为ClassB
对象,因为所有ClassA对象都不可避免地ClassB
对象。
如果您想知道反序列化对象是否是ClassB对象,可以使用以下代码:
ClassA a = ClassA.Deserialize("c:\directory\file.xml");
ClassB b = a as ClassB;
如果对象不是ClassB
实例,则b将为null。否则,您将把您的实例作为ClassB
对象。