【问题标题】:Problem with C# serialization extension methodsC# 序列化扩展方法的问题
【发布时间】:2009-02-05 13:47:50
【问题描述】:

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

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

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

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

更新:

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

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

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

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

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

出于结束问题的目的,我会将答案奖励给扩展 Marc's answer(包括 Marc)的任何人,并附上说明 [XmlInclude] 用法的代码示例。

【问题讨论】:

    标签: c# serialization extension-methods


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      您可以在此源中通过添加对第二个程序集的引用并使用 [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)) 一样使用它。

      【讨论】:

      • 我遇到的问题是尝试序列化 Foo 时发生故障。传递一个额外类型的对象仍然会产生同样的错误。
      猜你喜欢
      • 2010-10-12
      • 1970-01-01
      • 1970-01-01
      • 2011-10-19
      • 2011-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多