基本序列化会引发“无效的XML”错误

时间:2010-03-01 12:26:00

标签: c# .net xml-serialization

我有以下类结构(不简化btw):

[Serializable]
[XmlInclude(typeof(Twitter))]
[XmlInclude(typeof(LinkedIn))]
public abstract class SocialNetworkBase : ISocialNetwork
{
    public abstract string UserName { get; set; }
}

public class Twitter : SocialNetworkBase
{
    public override string UserName { get; set; }
}

public class LinkedIn : SocialNetworkBase
{
    public override string UserName { get; set; }
}

然后我试图序列化一个'SocialNetworkBase'列表,如:

new XmlSerializer(typeof(List<SocialNetworkBase>)).Serialize(ms, socialNetworks)

返回

<?xml version="1.0"?>
<ArrayOfSocialNetworkBase xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <SocialNetworkBase xsi:type="LinkedIn">
    <UserName>someUsername</UserName>
  </SocialNetworkBase>
</ArrayOfSocialNetworkBase>

尝试使用以下命令反序列化时:

return new XmlSerializer(typeof(List<SocialNetworkBase>)).Deserialize(ms) as List<SocialNetworkBase>;

抛出以下错误:

  

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

这里发生了什么?反序列化为SocialNetworBase[]会引发相同的错误。

6 个答案:

答案 0 :(得分:1)

你的问题是你的记忆流。 将数据序列化后,其光标位于流的末尾。如果你想使用它(例如用于反序列化),你需要将光标设置回流的开头:

ms.Seek(0, SeekOrigin.Begin);

答案 1 :(得分:0)

typeof(SocialNetworkBase[])

可能?

IIRC,你需要有一些容器对象(但我没有做到这一点是年龄,所以我不记得了。)

答案 2 :(得分:0)

[Serializable]
public abstract class SocialNetworkBase : ISocialNetwork
{
    public abstract string UserName { get; set; }
}

[Serializable]
public class Twitter : SocialNetworkBase
{
    public override string UserName { get; set; }
}

[Serializable]
public class LinkedIn : SocialNetworkBase
{
    public override string UserName { get; set; }
}

也许?

答案 3 :(得分:0)

Jus旁注。 (溪流位置似乎是问题,已经得到解答)

我注意到在类的顶部使用了[Serializable]。我们不需要那些您描述的功能。 'Serializable'属性与'System.Runtime'序列化程序(或格式化程序,如果您更喜欢该命名约定)一起使用。这里使用的XmlSerializer不需要(或使用)[Serializable]属性。

XmlSerializer可以在以下情况下序列化任何类型: - 它是一个公共类型,并有一个公共默认构造函数

答案 4 :(得分:0)

看一下这个问题,它看起来可能有用。

XML Serialization and Inherited Types

答案 5 :(得分:-2)

由于我已经经过ms.Position = 0,这不是问题。但是,当我放弃之前使用的StreamWriter赞成:

byte[] buffer = Encoding.UTF8.GetBytes(socialNetworks);
ms.Write(buffer, 0, (int)buffer.Length);

由于某种原因问题消失了。