Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#序列化扩展方法存在问题_C#_Serialization_Extension Methods - Fatal编程技术网

C#序列化扩展方法存在问题

C#序列化扩展方法存在问题,c#,serialization,extension-methods,C#,Serialization,Extension Methods,我真的很喜欢TWith2Sugars发布的扩展方法。不过我遇到了一个奇怪的问题。当我将其放入共享类库并调用序列化函数时,出现以下错误: 不应为MyType类型。使用 xmlclude或SoapInclude 属性来指定 静态地不知道 我环顾四周,发现XmlSerializer只能序列化它知道的类型。我将其解释为类库中的类,而不是基于该库构建的项目 有办法解决这个问题吗?这个函数可以放在类库中,还是需要放在每个使用它的项目中 更新: 我找出了问题的原因。我有以下代码: object o = new

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

不应为MyType类型。使用 xmlclude或SoapInclude 属性来指定 静态地不知道

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

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

更新:

我找出了问题的原因。我有以下代码:

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仍然会产生相同的错误。