我非常喜欢TWith2Sugars发布的here扩展方法。我遇到了一个奇怪的问题。当我把它放入共享类库并调用序列化函数时,我收到以下错误:
不期望MyType类型。使用 XmlInclude或SoapInclude 用于指定类型的属性 不知道静态。
我环顾四周,发现XmlSerializer只能序列化它知道的类型。我将其解释为类库中的类,而不是我根据该库构建的项目。
有解决方法吗?可以将此函数放入类库中,还是需要在每个使用它的项目中?
更新
我弄清楚导致问题的原因。我有以下代码:
object o = new MyClass();
o.Serialize();
这导致错误。当我将代码更改为:
MyClass c = new MyClass();
c.Serialize();
一切都很顺利。所以,经验教训 - 不要尝试(de)序列化通用对象。关于我引用的链接,我最喜欢的是我没有在我的类上放置任何XML属性标记。扩展方法刚刚起作用。
为了结束问题,我将向Marc's answer(包括Marc)扩展的人员提供答案,其中包含一个代码示例,说明[XmlInclude]的使用。
答案 0 :(得分:1)
你的理解是错误的。此错误的含义基本如下:XML序列化程序无法对类层次结构进行操作,除非您明确告诉它在所述层次结构中有哪些类。只需将每个派生类的类型XmlInclude
属性添加到基类中即可。
答案 1 :(得分:0)
您可以在此源中执行此操作,方法是添加对第二个程序集的引用并使用[XmlInclude]
- 但这可能很快会让您陷入一堆乱七八糟的项目中。您还可以在运行时将这些选项指定到序列化程序的构造函数中:
using System;
using System.Xml.Serialization;
[Serializable] public class Foo { }
[Serializable] public class Bar : Foo {}
static class Program {
static void Main()
{
XmlSerializer ser = new XmlSerializer(typeof(Foo),
new Type[] { typeof(Bar) });
ser.Serialize(Console.Out, new Bar());
}
}
重新扩展方法;您可以添加params Type[] extraTypes
,然后将extraTypes
传递到XmlSerializer
- 然后就可以像现在一样使用它,也可以.Serialize(typeof(Bar))
使用它。