铸造类
我有2类:铸造类
公共类ClassA的
公共类ClassB的(从另一个命名空间):ClassA的
我使用方法在ClassA的
public static ClassA Deserialize(string path)
{
ClassA classA;
//classA=code...
return classA;
}
我调用此方法B类
public void DoSomething()
{
ClassB classB=(ClassB)ClassA.Deserialize("c:\directory\file.xml);
}
方法反序列化的作品,但我得到错误,cannont投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)?
我可以改变方法反序列化是否会需要
甲不是一个B.乙是的A
(ClassB的)something_that_is_A无法做到的,除非它是一个B或它的衍生物。
没有显示你的Deserialize
代码这是相当很难说这是怎么回事。这很可能是问题的核心 - 如果您想要将结果投射到ClassB
,您需要使Deserialize
实际上创建ClassB
(或派生类)的实例。如果您的Deserialize
方法创建了一个ClassA
的实例,然后设置了一堆属性,则需要更改它或找到另一种方式来创建ClassB
实例。
如果该值是对实际实例ClassB
的引用,则只能将表达式转换为ClassB
。如果对象只是ClassA
的一个实例,那么你将无法投射 - 你会期望在ClassB
的任何额外字段中发生什么?除非用户定义的转换,否则为参考类型转换仅执行参考转换 - 它不创建新对象。 (有关更多详细信息,请参见Eric Lippert's blog post on representation and identity)。
您的方法返回一个void,因此您试图将void的返回值转换为ClassB。
具有ClassA
ClassB
继承不允许ClassA
对象被丢在一个ClassB
对象,因为所有ClassA的对象不是必然ClassB
对象。
如果你想知道,如果反序列化对象是ClassB的对象,你可以使用此代码:如果对象不是ClassB
实例
ClassA a = ClassA.Deserialize("c:\directory\file.xml");
ClassB b = a as ClassB;
,B将是空的。否则,您将将您的实例作为ClassB
对象。
请提供Deserialize()内部的代码 如果您正在使用classA构造函数创建ClassA对象的实例,您肯定会在运行时得到错误 – Ravisha 2010-03-01 08:27:26
带有字符串路径的想法,Type objectType是错误的? – user278618 2010-03-01 08:44:18