2010-03-01 2 views
0

Я следующую структуру класса (не упрощенный BTW):Basic сериализации выдает ошибку «Invalid 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

Уже делал это :-) –

+0

@jan: Проясните это: вы получаете ту же ошибку после использования Seek()? –

0

Jus побочное замечание. (Поток позиции, кажется, проблема, и был дан ответ)

Я заметил использование [Serializable] ontop классов. Нам не нужны те функции, которые вы описываете. Атрибут «Serializable» используется с сериализаторами «System.Runtime» (или Formatters, если вы предпочитаете это соглашение об именах). Используемый здесь XmlSerializer не требует (или не использует) атрибут [Serializable].

XmlSerializer может сериализовать любой тип, когда: -Это общественного типа и имеет конструктор по умолчанию

-2

Как я уже проходил мимо ms.Position = 0 это не было проблемой. Однако, когда канав StreamWriter я использовал ранее в пользу:

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

Проблема ушла по какой-то причине.

+1

socialNetworks - это строка ???? Обновите свой вопрос с помощью этой информации, не публикуйте ответ. –

Смежные вопросы