【问题标题】:Error Deserializing XML (C#): There is an error in XML document (2, 2) (but XmlSerializer created it)Error Deserializing XML (C#): There are an error in XML document (2, 2)(但 XmlSerializer 创建了它)
【发布时间】:2026-01-26 17:50:01
【问题描述】:

我知道,我知道有关无法反序列化 XML 并出现错误“XML 文档 (2, 2) 中有错误”的问题。网上到处都是乱七八糟的,但我还是很难过。

我有一个使用 C# 类中的 XmlSerializer 创建的 XML 文档。此文档无法反序列化并出现异常:

There is an error in XML document (2, 2).
Inner Exception: The server could not be contacted.
Root inner exception: The LDAP server is unavailable.

我正在使用 XmlSerializer 进行序列化和反序列化,奇怪的是,有问题的 XML 文档可以在另一台计算机上使用相同的代码进行反序列化。

我使用以下代码序列化和反序列化我在 C# 中生成的类:

    public static T DeserializeObject<T>(string filename)
    {
        Console.WriteLine("Reading with XmlReader");

        // Create an instance of the XmlSerializer specifying type and namespace.
        XmlSerializer serializer = new
        XmlSerializer(typeof(T));

        // A FileStream is needed to read the XML document.
        FileStream fs = new FileStream(filename, FileMode.Open);
        xml.XmlReader reader = xml.XmlReader.Create(fs);

        // Declare an object variable of the type to be deserialized.
        T i;

        // Use the Deserialize method to restore the object's state.
        i = (T)serializer.Deserialize(reader);
        fs.Close();
        return i;
    }

    public static void WriteObject<T>(T value, string filename)
    {
        XmlSerializer serializer = new XmlSerializer(typeof(T));
        TextWriter tw = new StreamWriter(filename);
        serializer.Serialize(tw, value);
        tw.Close();
    }

XML 文档本地存储在: C:\Users\用户名\AppData\Local\myapp\myxmldoc.xml

并遵循以下格式:

<?xml version="1.0" encoding="utf-8"?>
<MyClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Id xsi:nil="true" />
  <Property1>text</Property1>
  <Property2>0000000</Property2>
  <Property3>
    <Property31>
      <Property311>text</Property311>
      <Property312>text</Property312>
    </Property31>    
  </Property3>  
  <Property4 />
  <Property5>false</Property5>
</MyClass>

我使用以下代码进行反序列化:

myclassvar = SerialiseXML.DeserializeObject<MyClass>(xmldocpath);

其他类在有问题的计算机上可以序列化和反序列化 XML。

哦,顺便说一句,我通过验证器运行了代码,没有发现任何错误。

有什么想法吗?

【问题讨论】:

  • 我认为“LDAP 服务器不可用。”
  • 另外,您的 Stream、XmlReader 和 TextWriter 上缺少 using 块。
  • 在使用 XML 文档时,发生了一个完全不相关的错误。 XML 内容恰好位于处理和报告错误的调用堆栈的顶部。

标签: c# xml xmlserializer


【解决方案1】:

鉴于您的错误消息,LDAP 服务器似乎不可用,因为无法联系它。这可能是由于您要反序列化的类中的属性在设置其值时调用 LDAP 服务器引起的。以如下代码为例,如果服务器名无效,反序列化时会连接服务器失败:

[Serializable]
public class TestData
{
   private bool connect;

   private TcpClient connection;

   public string ServerName {get; set;}

   public bool ConnectToServer { 
       get { return this.connect; }
       set { 
          if (this.connect = value)
          {
              this.connection = new TcpConnection(this.ServerName, 8080);
          }
       }
   }
}

【讨论】:

  • 这就是令人困惑的地方。我坚持我没有调用 LDAP 服务器,但你是对的 :)
  • 愚蠢的界面不会让我在没有发布的情况下按 Enter 键,但是在“MyClass”属性的构造函数中,我得到了登录用户的显示名称(即 this.WindowsDisplayName = System.DirectoryServices .AccountManagement.UserPrincipal.Current.DisplayName;) 和用户名 (this.WindowsUsername = System.Security.Principal.WindowsIdentity.GetCurrent().Name;)。这导致了问题,因为它无法使这些(或可能只是名称)脱机。谢谢!不幸的是,由于我缺乏业力,我无法为您的答案投票,但我恳请所有通过这里的人投票:)