【发布时间】:2012-01-24 22:58:18
【问题描述】:
为什么以下内容不反序列化?异常如下所示。请注意,我正在使用新的流序列化和反序列化来避免“流结束”错误。我也在使用新的 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>
【问题讨论】:
-
你应该使用
using语句 -
Class1没有标识根元素的属性,并且您在创建序列化程序实例时没有指定一个属性,因此序列化程序不知道根元素的名称是应该匹配 Class1 文档。序列化程序必须知道类型和根元素名称;它本身不会将类型名称分配为根元素名称。