我有以下类结构(不简化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[]
会引发相同的错误。
答案 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)
看一下这个问题,它看起来可能有用。
答案 5 :(得分:-2)
由于我已经经过ms.Position = 0
,这不是问题。但是,当我放弃之前使用的StreamWriter
赞成:
byte[] buffer = Encoding.UTF8.GetBytes(socialNetworks);
ms.Write(buffer, 0, (int)buffer.Length);
由于某种原因问题消失了。