2010-03-04 3 views
3

Когда я пытаюсь сериализовать словарь, все работает нормально. но когда я десериализую, он показывает, что число равно 0. Но он отлично работает со списком. Что происходит, когда мы десериализируем список и словарь?Проблема десериализации с помощью словаря

+1

Покажите нам код! – spender

+0

Какой сериализатор? Это имеет значение ** много **? Это 'XmlSerializer'? 'BinaryFormatter'? 'DataContractSerializer'? 'NetDataContractSerializer'? JSON? proto bufs? МЫЛО? Я боюсь, что у каждого есть тонкое поведение. Многие (не все) * do * поддерживают сериализацию словаря. Вам также могут потребоваться дополнительные шаги, если вы сделали пользовательскую сериализацию ('ISerializable' и т. Д.). –

+0

Я пытаюсь сериализовать использование BinaryFormatter .. – sandhya

ответ

3

Словари на самом деле не поддерживают сериализацию. Это известная проблема, которая беспокоит многих программистов, поэтому, если вы выполните «Сериализация словаря .NET», вы получите много результатов с «практическими» и обходными решениями.

Например, этот blog post предлагает использовать класс KeyedCollection.

+0

Вы правильно относитесь к словарям, но исключения могут быть сериализованы. – Timores

+0

@ Тимуры, я удалил часть об исключениях. У меня возникли проблемы с сериализацией исключений из-за содержащегося в нем члена словаря, но это может быть связано с определенным типом исключения, которое я сериализую, или тем фактом, что я использовал XmlSerializer, или, может быть, даже в том, что я использовал VB. В любом случае, я не думаю, что вы можете вообще сказать, что все исключения являются сериализуемыми, я подозреваю, что правда находится где-то посередине. Пожалуйста, уточните, если у вас есть дополнительная информация по этому вопросу. –

+0

В общем, не все классы сериализуемы, я согласен. И мы должны определить, говорим ли мы о бинарной сериализации или сериализации XML. Я думал о первом, где вы можете реализовать ISerializable, чтобы перенести процесс сериализации и сериализовать класс со встроенным словарем. Вы можете использовать любой язык .NET, между прочим, все они семантически эквивалентны. – Timores

1

Если вы используете .Net 3.5, вы можете использовать DataContractSerializer, который будет сериализовать словарь. Это также быстрее, чем BinaryFormatter или XmlSerializer.

using System.Runtime.Serialization; 

var dict = new Dictionary<string, string>(); 
dict.Add("a","a"); 

DataContractSerializer dcs = new DataContractSerializer(dict.GetType()); 
MemoryStream byteStream = new MemoryStream(); 
dcs.WriteObject(byteStream, dict); 
byteStream.Position = 0; 

var dict2 = dcs.ReadObject(byteStream); 
Смежные вопросы