当我尝试对一个对象进行XML序列化时,出现了错误。

7
System.Web.Services.Protocols.SoapException: Server was unable to process request. ---> System.InvalidOperationException: There was an error generating the XML document. ---> System.InvalidOperationException: The type ProfileChulbul was not expected. Use the XmlInclude or SoapInclude attribute to specify types that are not known statically.
   at System.Xml.Serialization.XmlSerializationWriter.WriteTypedPrimitive(String name, String ns, Object o, Boolean xsiType)
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterProfileDefinitionExportHolder.Write1_Object(String n, String ns, Object o, Boolean isNullable, Boolean needType)

如果你看到 'ProfileChulbul' 是一个对象,我正在尝试序列化。

1
BreakHead,这个问题仍然非常模糊。请发布您要序列化的类的代码。 - Daniel Schaffer
2个回答

25

当你要序列化的类型具有一个对于序列化器实例来说是不确定的类型属性时,就会出现这种情况。例如,如果类型ProfileChulbul具有基类型,并且从正在序列化的内容中引用它,那么序列化器将不知道如何处理它。

你有几种解决此问题的选择:

  • ProfileChulbul的基类上添加[XmlInclude(typeof(ProfileChulbul))]属性(以及任何其他将使用的类型的附加属性)

  • 修改用于序列化的类,改为使用泛型而不是Object

  • 在运行时将typeof(ProfileChulbul)(以及任何其他将使用的类型)传递到序列化器构造函数中,像这样:

    var knownTypes = new Type[] { typeof(ProfileChulbul), typeof(ProfileSomethingElse) };

    var serializer = new XmlSerializer(typeof(TheSerializableType), knownTypes);


1
谢谢你,Daniel。Stack Overflow 真是太棒了 :) - BreakHead

1
根据堆栈跟踪的一部分“使用 XmlInclude 或 SoapInclude 属性指定静态不可知类型”,我敢打赌您正在尝试序列化接口或接口集合?XML 序列化不允许这样做,尝试使用 XmlInclude 属性标记接口。

那我该怎么做呢?因为我要序列化的对象是一个通用对象。 - BreakHead
1
BreakHead,这正是导致错误的原因。你能否使用泛型而不是普通对象? - Daniel Schaffer
+1 我有同样的经历 :-( 现在我正在使用 sharpserializer,它可以处理 XML 序列化和反序列化。 - k3b
@BreakHead,如果你要序列化一个对象,你必须知道要序列化的具体类型。你能发一些代码让它更清晰一些吗? - Steve Danner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接