XmlSerializer 和 XmlException - 缺少根元素

发布于 2024-12-29 07:10:55 字数 3212 浏览 3 评论 0原文

为什么以下不反序列化?异常情况如下所示。请注意,我使用新的流序列化和反序列化来避免“流结束”错误。我还使用新的 XmlSerializer 实例来避免出现类似问题。

序列化工作正常。我已经审查了许多类似名称的问题,但均无济于事。

异常:

System.InvalidOperationException was unhandled
  Message=There is an error in XML document (0, 0).
  Source=System.Xml
  StackTrace:
   at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
   at System.Xml.Serialization.XmlSerializer.Deserialize(Stream stream)
   at TestSerilalization.Program.Main(String[] args) in D:\MyDocs\Projects\dsb\Src\Apps\RecipeMgr\Other\TestSerlialization\Program.cs:line 45
   at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
   at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
   at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
   at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ThreadHelper.ThreadStart()
 InnerException: System.Xml.XmlException
   Message=Root element is missing.
   Source=System.Xml
   LineNumber=0
   LinePosition=0
   SourceUri=""
   StackTrace:
        at System.Xml.XmlTextReaderImpl.Throw(Exception e)
        at System.Xml.XmlTextReaderImpl.ParseDocumentContent()
        at System.Xml.XmlTextReaderImpl.Read()
        at System.Xml.XmlTextReader.Read()
        at System.Xml.XmlReader.MoveToContent()
        at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderClass1.Read4_Class1()
   InnerException: 

代码:

static void Main(string[] args)
{
XmlSerializer xmlSerializer = new System.Xml.Serialization.XmlSerializer( typeof( Class1 ), "http://xxx" );

Class1 c1 = new Class1();

FileStream strm = File.Create( "d:\\temp\\classes.xml" );
xmlSerializer.Serialize( strm, c1 );
strm.Close();

Class1 c2 = null;
FileStream strm2 = File.Create( "d:\\temp\\classes.xml" );
XmlSerializer xmlSerializer2 = new System.Xml.Serialization.XmlSerializer( typeof( Class1 ), "http://xxx" );
c2 = (Class1)xmlSerializer2.Deserialize( strm2 );
strm2.Close();
}

public class Class1
{
public Class1()
  {
  m_Class2 = new Class2();
  }

public Class2 class2
  {
  get { return m_Class2; }
  set { m_Class2 = value; }
  }

private Class2  m_Class2;
}

public class Class2
{
public Class2()
  {
  m_Int = 999;
  m_Str = "sdfsdfsdsd";
  }

public int getInt
  {
  get { return m_Int; }
  set { m_Int = value; }
  }

public string getStr
  {
  get { return m_Str; }
  set { m_Str = value; }
  }

private int     m_Int;
private string  m_Str;
}

生成的xml:

<?xml version="1.0"?>
<Class1 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://xxx">
  <class2>
    <getInt>999</getInt>
    <getStr>sdfsdfsdsd</getStr>
  </class2>
</Class1>

Why doesn't the following deserialize? The exception is shown below. Note that I'm using new streams serialization and deserialization to avoid "end of stream" errors. I'm also using new XmlSerializer instances to avoid similar problems there.

Serialization works fine. I've reviewed MANY of the similarly-named questions to no avail.

Exception:

System.InvalidOperationException was unhandled
  Message=There is an error in XML document (0, 0).
  Source=System.Xml
  StackTrace:
   at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
   at System.Xml.Serialization.XmlSerializer.Deserialize(Stream stream)
   at TestSerilalization.Program.Main(String[] args) in D:\MyDocs\Projects\dsb\Src\Apps\RecipeMgr\Other\TestSerlialization\Program.cs:line 45
   at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
   at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
   at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
   at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ThreadHelper.ThreadStart()
 InnerException: System.Xml.XmlException
   Message=Root element is missing.
   Source=System.Xml
   LineNumber=0
   LinePosition=0
   SourceUri=""
   StackTrace:
        at System.Xml.XmlTextReaderImpl.Throw(Exception e)
        at System.Xml.XmlTextReaderImpl.ParseDocumentContent()
        at System.Xml.XmlTextReaderImpl.Read()
        at System.Xml.XmlTextReader.Read()
        at System.Xml.XmlReader.MoveToContent()
        at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderClass1.Read4_Class1()
   InnerException: 

Code:

static void Main(string[] args)
{
XmlSerializer xmlSerializer = new System.Xml.Serialization.XmlSerializer( typeof( Class1 ), "http://xxx" );

Class1 c1 = new Class1();

FileStream strm = File.Create( "d:\\temp\\classes.xml" );
xmlSerializer.Serialize( strm, c1 );
strm.Close();

Class1 c2 = null;
FileStream strm2 = File.Create( "d:\\temp\\classes.xml" );
XmlSerializer xmlSerializer2 = new System.Xml.Serialization.XmlSerializer( typeof( Class1 ), "http://xxx" );
c2 = (Class1)xmlSerializer2.Deserialize( strm2 );
strm2.Close();
}

public class Class1
{
public Class1()
  {
  m_Class2 = new Class2();
  }

public Class2 class2
  {
  get { return m_Class2; }
  set { m_Class2 = value; }
  }

private Class2  m_Class2;
}

public class Class2
{
public Class2()
  {
  m_Int = 999;
  m_Str = "sdfsdfsdsd";
  }

public int getInt
  {
  get { return m_Int; }
  set { m_Int = value; }
  }

public string getStr
  {
  get { return m_Str; }
  set { m_Str = value; }
  }

private int     m_Int;
private string  m_Str;
}

The generated xml:

<?xml version="1.0"?>
<Class1 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://xxx">
  <class2>
    <getInt>999</getInt>
    <getStr>sdfsdfsdsd</getStr>
  </class2>
</Class1>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

愚人国度 2025-01-05 07:10:55

File.Create 创建一个新的空白文件。
因此,您正在读取一个空文件。

您可能需要File.Open

File.Create creates a new blank file.
Therefore, you're reading an empty file.

You probably want File.Open.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文