【问题标题】:C# Serialization between Objects to XML对象到 XML 之间的 C# 序列化
【发布时间】:2020-09-22 09:05:12
【问题描述】:

这是我第一次尝试序列化 XML,我需要了解为什么我的代码会出现错误:

private void function(Object2 InputParameters)
{

   XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
   ns.Add("", "");
   XmlSerializer s = new XmlSerializer(typeof(Object1));
   StringWriter XMLWriter = new StringWriter();
   s.Serialize(XMLWriter, InputParameters, ns);

   XmlDocument DOC_Xml = new XmlDocument();
   DOC_Xml.LoadXml(XMLWriter.ToString());
}

内部异常:

{“'SRV.Entities.Object2'类型的对象无法转换为'SRV.Entities.Object1'类型。”}

堆栈跟踪:

"   in System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespaces, String encodingStyle, String id)\r\n   in System.Xml.Serialization.XmlSerializer.Serialize(TextWriter textWriter, Object o, XmlSerializerNamespaces namespaces)\r\n "

错误行在s.Serialize(XMLWriter, ParametrosEntrada, ns);,但我不明白原因。 如何解决不同对象之间的序列化? 谢谢各位。

【问题讨论】:

  • Xml 序列化要求序列化类和反序列化类相同,但有一些例外 1) 只查看公共变量 2) 对象类型必须相同。因此,当 xml 标记包含子项时,您不能在反序列化类中包含字符串。
  • 您能分享一个minimal reproducible example 来演示这个问题吗?可能您的InputParameters 对象不是Object1 类型,但我们需要确认。如果是这样,从您的问题中不清楚您是否正在尝试序列化Object2Object1 的子类的多态类型层次结构。请参阅How to Ask帮助其他人重现问题...如果您的问题与您编写的代码有关,您应该包含一些...包含足够的代码以允许其他人重现问题。
  • 如果只需要将对象转换为XML字符串,可以使用this answerConvert an object to an XML string。但是,直接序列化到 XmlDocument 而不需要中间的 string 表示应该更高效。为此,请使用从 this answerPopulating ANY elements on a web service in C#XmlNodeExtensions.AsXmlDocument()

标签: c# xml serialization


【解决方案1】:

你有一个错误

private void function(Object2 InputParameters)

XmlSerializer s = new XmlSerializer(typeof(Object1));

你需要

XmlSerializer s = new XmlSerializer(typeof(Object2));

aka,您需要始终将“Object2”作为输入参数和“typeof”的参数。

更深入地,您可以考虑泛型。因此,您可以根据需要传递类型 is....对象 1 或对象 2。 (但不是两者)

private void MyFunction<T>(T InputParameters)
{

   XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
   ns.Add("", "");
   XmlSerializer s = new XmlSerializer(typeof(T));
   StringWriter XMLWriter = new StringWriter();
   s.Serialize(XMLWriter, InputParameters, ns);

   XmlDocument DOC_Xml = new XmlDocument();
   DOC_Xml.LoadXml(XMLWriter.ToString());
}

您可以在这个 SOF 答案中看到更多信息:

Using generics with XmlSerializer

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多