【发布时间】:2012-01-13 03:40:17
【问题描述】:
编辑这段代码应该能说明整个问题:
[XmlInclude(typeof(AThing1))]
public abstract class AThing
{
public abstract string Name { get; set; }
}
[XmlInclude(typeof(IThing1))]
public interface IThing
{
string Name { get; set; }
}
public class AThing1 : AThing
{
public override string Name { get; set; }
}
public class IThing1 : IThing
{
public string Name { get; set; }
}
List<AThing> aThings = new List<AThing>(new AThing[] { new AThing1() { Name = "Bob" } });
List<IThing> iThings = new List<IThing>(new IThing[] { new IThing1() { Name = "Bob" } });
public void Test()
{
using (StringWriter sw = new StringWriter())
{
XmlSerializer aSerializer = new XmlSerializer(typeof(List<AThing>));
aSerializer.Serialize(sw, aThings);
string text = sw.ToString();
}
using (StringWriter sw = new StringWriter())
{
// This line will throw "Cannot serialize interface IThing.":
XmlSerializer iSerializer = new XmlSerializer(typeof(List<IThing>));
iSerializer.Serialize(sw, iThings);
string text = sw.ToString();
}
}
aSerializer 生成的第一个text 将是:
<?xml version="1.0" encoding="utf-16"?>
<ArrayOfAThing xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<AThing xsi:type="AThing1">
<Name>Bob</Name>
</AThing>
</ArrayOfAThing>
我不明白为什么iSerializer 不能这样做:
<?xml version="1.0" encoding="utf-16"?>
<ArrayOfIThing xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<IThing xsi:type="IThing1">
<Name>Bob</Name>
</IThing>
</ArrayOfIThing>
而不是抛出异常。
【问题讨论】:
-
你试过编译你的代码吗?我认为上面的代码不会编译。另外,请发布您用于序列化的代码。这将更容易说明问题所在。
-
@JohnSaunders:查看我的更新,我认为现在应该很清楚了。
-
郑重声明,您收到的完整异常是什么?
-
“无法序列化接口 IThing。”是最内在的例外。上面的那个没有任何帮助。但是如果你将
List<IThing>作为一个类的成员,你会得到类似“不能序列化成员......因为它是一个接口”。
标签: c# .net xmlserializer