0

我真的很喜欢 TWith2Sugars 在这里发布的扩展方法。我遇到了一个奇怪的问题。当我将它放入共享类库并调用序列化函数时,出现以下错误:

MyType 类型不是预期的。使用 XmlInclude 或 SoapInclude 属性指定静态未知的类型。

我环顾了一下,发现 XmlSerializer 只能序列化它知道的类型。我将其解释为类库中的类,而不是我基于该库构建的项目。

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

更新:

我弄清楚是什么导致了这个问题。我有以下代码:

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

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

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

一切运行良好。所以,吸取教训 - 不要尝试(反)序列化通用对象。我最喜欢我引用的链接的一点是我不必在我的类上放置任何 XML 属性标签。扩展方法刚刚奏效。

出于结束问题的目的,我将通过说明 [XmlInclude] 使用的代码示例将答案授予扩展Marc 的答案(包括 Marc)的任何人。

4

2 回答 2

1

你的理解是错误的。此错误的含义基本上如下:除非您明确告诉它在所述层次结构中有哪些类,否则 XML 序列化程序无法对类层次结构进行操作。只需将XmlInclude每个派生类的类型的属性添加到您的基类即可。

于 2009-02-05T13:51:27.123 回答
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)).

于 2009-02-05T13:57:43.973 回答