在.Net中再次使用Xml序列化时遇到一些麻烦......(
)附件是代码(顶部的原始工作版本,下面的新非工作版本)
(Cast to Rental被添加为测试 - 无论是否有该演员都失败了)
对于隐式定义的对象,xml反序列化失败,并出现以下错误:
“XML文档(0,0)中存在错误。” “根元素缺失”
关于为什么我不能反序列化隐式声明的对象的任何建议。看起来像是一个逻辑上的事情 - 显式和隐式对象之间的区别是什么?
顺便说一下,如果我做一个rental.GetType(),它会返回Rental(因此它是正在实例化的正确对象类型)。
反序列化方法如下所示:
答案 0 :(得分:0)
请在反序列化之前尝试将以下行添加到Deserialize
方法中。
if (stream.CanSeek) stream.Position = 0; // fix a possible positioning issue on the stream
var obj = s.Deserialize(stream);
答案 1 :(得分:0)
我在之前的评论中注意到的一件事
XML文档(1,2)中存在错误。 < 租借 xmlns =''>
如果流中的xml实际上用小写r拼写“租用”,我不知道 这些将如何工作 - 它必须是“租赁” “使用大写字母R来匹配您的类型名称。也许这只是一个错字,但我想我会指出它,因为你的代码应该工作。
更新:OP解释说这是因为课堂上有[XmlType("rental")]
装饰。所以这不是问题的原因。
除非我严重错误,否则
的编译版本确实没有区别Rental r = new Rental();
和
var r = new Rental();
使用这样的XML文件(D:\Rental2.txt)
:
<Rental>
<ID>10</ID>
</Rental>
此代码将在LinqPad中运行并成功反序列化显式和隐式变量:
void Main()
{
var sw = new StreamReader(@"d:\Rental2.txt");
try
{
//explicit
Rental r = new Rental();
var Explicit = r.Deserialise(sw.BaseStream);
Console.WriteLine(Explicit);
//implicit
var rrr = new Rental();
var Implicit = rrr.Deserialise(sw.BaseStream);
Console.WriteLine(Implicit);
}
catch(Exception)
{
}
finally
{
sw.Close();
}
}
public class Rental
{
public int ID {get;set;}
}
public static class Extensions
{
public static T Deserialise<T>(this T Object,Stream stream)
{
if (stream.CanSeek)
{
stream.Position=0;
}
var ser = new XmlSerializer(typeof(T));
return (T)ser.Deserialize(stream);
}
}
输出:
UserQuery+Rental
ID 10
UserQuery+Rental
ID 10
您可以发布您尝试反序列化的源数据吗?也许有一些古怪的东西呢?
答案 2 :(得分:0)
@wdosanjos是对的。如果您正在运行两个Deserialize
,请尝试在第二个Deserialize
之前将流的位置重置为0。
Rental r = new Rental();
r = r.Deserialize(stream);
stream.Position = 0; // reset stream position.
var rrr = new Rental();
rrr = ((Rental)rrr).Deserialize(stream);