2011-04-07 72 views
3

我不明白为什么我们不能序列化从接口派生的具体类。具体类的属性仍然是已知的!为什么我们不能序列化从接口派生的具体类?

public interface IThing 
{ 
    string Name { get; } 
} 

[XmlRoot] 
public class RealThing : IThing 
{ 
    [XmlAttribute] 
    public string Name { get { return "Real Thing"; } set{ /* Do something. */ } } 
} 

我已经告诉了XmlSerializer如何处理实现的属性做,为什么这样不行?为什么XmlSerializer甚至会看界面?

我已经做了大量的可序列化的类,现在正在运行。过去我所做的数百个可序列化类中是否可能实现了一个接口?

+0

唯一的错误我与该类得到的是,这是不公开。你有什么具体的错误吗? – 2011-04-07 20:01:04

+0

反正有什么错误?我只是运行这个代码并按预期工作。 (Name属性不会被序列化,因为它没有setter) – 2011-04-07 20:08:23

+1

它看起来像我忽略了在我的问题中包含最重要的细节 - 这是RealThing实际上是列表,IThing - 这是问题现在很明显。请忽略! – 2011-04-07 20:16:50

回答

9

你当然可以序列化一个继承了接口的类。但是你不能告诉序列化程序到序列化接口,因为它不知道在反序列化中实例化哪个具体类。

换句话说系列化会的工作,如果你实例化序列化是这样的:

XmlSerializer ser = new XmlSerializer(typeof(RealThing)); 
ser.Serialize(new MemoryStream(), new RealThing()); 

此外,您将需要RealThing一个公共类,因为这是由Xmlserializer要求。

+0

是的,我错误地键入我的例子。但这也不再是一个问题 - 请参阅我的主要意见为什么(我忽略了重要部分)。谢谢。 – 2011-04-07 20:17:41

4

你的财产需要一个二传手。 XML序列化程序仅序列化公共读/写属性。

+0

是的,这是我的例子中的一个错误,并没有造成潜在的问题。不过谢谢。 – 2011-04-07 20:00:24

0

我刚刚用XmlSerializer对RealThing进行了序列化。

无论你的问题是,我不认为这是因为RealThing实现一个接口...

相关问题