C#序列化扩展方法的问题

时间:2009-02-05 13:47:51

标签: c# serialization extension-methods

我非常喜欢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]的使用。

2 个答案:

答案 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))使用它。