2009-02-05 52 views
0

我真的很喜欢TWith2Sugars发布的扩展方法here。尽管我遇到了一个奇怪的问题。当我把这个变成一个共享的类库,并调用序列化功能,我得到以下错误:C#序列化扩展方法的问题

The type MyType was not expected. Use the XmlInclude or SoapInclude attribute to specify types that are not known statically.

我四处张望了一下,发现XmlSerializer的只能序列化类型,它是知道的。我将其解释为类库中的类,而不是我根据该库创建的项目。

有没有办法解决这个问题?这个函数可以放在类库中,还是需要放在每个使用它的项目中?

更新:

我想通了,是什么原因导致的问题。我有以下代码:

object o = new MyClass(); 
o.Serialize(); 

这是导致错误。当我将代码更改为:

MyClass c = new MyClass(); 
c.Serialize(); 

一切正常。所以,吸取教训 - 不要试图(去)序列化通用对象。我最喜欢的关于我引用的链接的东西是,我不必在我的类上放置任何XML属性标记。扩展方法刚刚工作。

为了解决这个问题,我将给出答案,以便扩展到Marc's answer(包括Marc)的任何人使用说明使用[XmlInclude]的代码示例。

回答

1

你的理解是错误的。这个错误的含义基本如下:XML序列化程序不能对类层次结构进行操作,除非您明确告诉它该层次结构中存在哪些类。只需将每个派生类的类型XmlInclude属性添加到您的基类中即可完成。

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()); 
    } 
} 

Re扩展方法;你可以添加一个params Type[] extraTypes,并将extraTypes加入XmlSerializer - 那么你可以像现在这样使用它,或者使用.Serialize(typeof(Bar))

+0

我遇到的问题是当尝试序列化Foo时发生故障。传递一个额外类型的对象仍然会给出相同的错误。 – 2009-02-05 14:57:42