2010-03-01 61 views
0

我有以下的類結構(未BTW簡體):基本系列化拋出一個「無效的XML」的錯誤

[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
typeof(SocialNetworkBase[]) 

也許?

IIRC,你需要有一些容器對象(但我沒有做到這一點是年齡,所以我不記得)。

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; } 
} 

也許吧?

1

你的問題是你的記憶流。 將數據序列化後,其遊標位於數據流的末尾。如果你想使用它(對於反序列化的目的,例如),您需要設置光標返回到流的開頭:

ms.Seek(0, SeekOrigin.Begin); 
+0

已經這樣做了:-) – 2010-03-01 12:59:32

+0

@jan:請清除它:使用Seek()後會出現同樣的錯誤嗎? – 2010-03-01 14:33:54

0

物權法旁註。 (流的位置似乎是問題,並已被回答)

我注意到使用類的[Serializable] ontop。我們不需要這些功能來描述您所描述的功能。 'Serializable'屬性用於'System.Runtime'序列化器(如果你更喜歡命名約定,則使用格式化器)。這裏使用的XmlSerializer不需要(或使用)[Serializable]屬性。

XmlSerializer的可序列化ANY類型時: - 它是一個公共型和具有公共默認構造函數

-2

正如我已經由ms.Position = 0通過這個不是問題。然而,開溝StreamWriter當我贊成前面使用:

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

問題走了出於某種原因。

+1

socialNetworks是一個字符串?用這個信息更新你的問題,不要發佈答案。 – 2010-03-01 14:00:48

相關問題