隐含定义的对象&反序列化

时间:2014-02-12 00:15:26

标签: c# .net xml serialization

在.Net中再次使用Xml序列化时遇到一些麻烦......(

附件是代码(顶部的原始工作版本,下面的新非工作版本) enter image description here

(Cast to Rental被添加为测试 - 无论是否有该演员都失败了)

对于隐式定义的对象,xml反序列化失败,并出现以下错误:

“XML文档(0,0)中存在错误。” “根元素缺失”

关于为什么我不能反序列化隐式声明的对象的任何建议。看起来像是一个逻辑上的事情 - 显式和隐式对象之间的区别是什么?

顺便说一下,如果我做一个rental.GetType(),它会返回Rental(因此它是正在实例化的正确对象类型)。

反序列化方法如下所示:

enter image description here

3 个答案:

答案 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);