C#序列化扩展方法存在问题
我真的很喜欢TWith2Sugars发布的扩展方法。不过我遇到了一个奇怪的问题。当我将其放入共享类库并调用序列化函数时,出现以下错误: 不应为MyType类型。使用 xmlclude或SoapInclude 属性来指定 静态地不知道 我环顾四周,发现XmlSerializer只能序列化它知道的类型。我将其解释为类库中的类,而不是基于该库构建的项目 有办法解决这个问题吗?这个函数可以放在类库中,还是需要放在每个使用它的项目中 更新: 我找出了问题的原因。我有以下代码:C#序列化扩展方法存在问题,c#,serialization,extension-methods,C#,Serialization,Extension Methods,我真的很喜欢TWith2Sugars发布的扩展方法。不过我遇到了一个奇怪的问题。当我将其放入共享类库并调用序列化函数时,出现以下错误: 不应为MyType类型。使用 xmlclude或SoapInclude 属性来指定 静态地不知道 我环顾四周,发现XmlSerializer只能序列化它知道的类型。我将其解释为类库中的类,而不是基于该库构建的项目 有办法解决这个问题吗?这个函数可以放在类库中,还是需要放在每个使用它的项目中 更新: 我找出了问题的原因。我有以下代码: object o = new
object o = new MyClass();
o.Serialize();
这是导致错误的原因。当我将代码更改为:
MyClass c = new MyClass();
c.Serialize();
一切都很顺利。所以,吸取的教训是——不要尝试(反)序列化泛型对象。关于我引用的链接,我最喜欢的是我不必在类上放置任何XML属性标记。扩展方法刚刚奏效
为了结束这个问题,我将把答案奖励给任何用代码示例说明[xmlclude]用法的人(包括Marc)。您的理解是错误的。这个错误的基本含义如下:除非您显式地告诉XML序列化程序在所述层次结构中有哪些类,否则XML序列化程序无法对类层次结构进行操作。只需将每个派生类的类型的
xmlclude
属性添加到基类中,就完成了。在这个源代码中,您可以通过添加对第二个程序集的引用并使用[xmlclude]
来完成这项工作,但这可能会很快让您陷入项目的循环混乱。您还可以在运行时将这些选项指定到序列化程序的构造函数中:
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))
一样使用它。我遇到的问题是,尝试序列化Foo时出现了故障。传递对象的extraType仍然会产生相同的错误。