Сериализация System.Collections.Generic.Dictionary
От: tev1973  
Дата: 11.07.06 07:36
Оценка:
При выполнении XML-сериализации класса

[Serializable]
public sealed class ConfigurationConv
{
public System.Collections.Generic.Dictionary<string, ConfigModule> itemsConf;

public ConfigurationConv(int capacityDic)
{
itemsConf = new Dictionary<string, ConfigModule>(capacityDic);
}
};

на строке кода, создающего экземпляр класса XmlSerializer генерируется исключение InvalidOperationException
При просмотре детальной информации в VS2005 для этого исключения , обнаружилась строка:

{"Cannot serialize member Crys.AudAux.ConfigurationConv.itemsConf of type System.Collections.Generic.Dictionary`2[[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[Crys.AudAux.ConfigModule, AudAux, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], because it implements IDictionary."}

Код для сериализации:

XmlSerializer serializer = new XmlSerializer(typeof(ConfigurationConv));
StringBuilder appConf = new StringBuilder();
XmlWriter xwriter = XmlWriter.Create(appConf);
serializer.Serialize(xwriter, m_confService);
xwriter.Close();

Объявление класса ConfigModule:

[Serializable]
public sealed class ConfigModule
{
private StringBuilder NameAuditSource;

private StringBuilder DataSourceDb;
public ConfigModule()
{
NameAuditSource = new StringBuilder(String.Empty);
DataSourceDb = new StringBuilder(String.Empty);
}
}

помогите решить проблему
Re: Сериализация System.Collections.Generic.Dictionary
От: V.Petrovski Беларусь  
Дата: 11.07.06 08:16
Оценка:
Здравствуйте, tev1973, Вы писали:

[skipped]

XmlSerializer не умеет сериализовать IDictionary.
Надо реализовать IXmlSerializable или сконвертить в колекцию.


RSDN@Home 1.2.0
Nemerle
[url=http://www40.brinkster.com/developertools].NET Localizer[/ur
Re: Сериализация System.Collections.Generic.Dictionary
От: VladD2 Российская Империя www.nemerle.org
Дата: 11.07.06 22:47
Оценка:
Здравствуйте, tev1973, Вы писали:

Создай левое свойство содержащее, например, массив KeyValuePair<K,V> и заставь сериализоваться его вместо хэш-таблицы.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Сериализация System.Collections.Generic.Dictionary
От: tev1973  
Дата: 12.07.06 13:09
Оценка:
Здравствуйте, V.Petrovski, Вы писали:

VP>XmlSerializer не умеет сериализовать IDictionary.

VP>Надо реализовать IXmlSerializable или сконвертить в колекцию.

Получилось реализовать для класса ConfigurationConv интерфейс IXmlSerializable.
Правда сначала System.Collections.Generic.Dictionary<string, ConfigModule> itemsConf
сериализую в бинарную строку а затем в XML-формат. Вот какие получились методы реализующие IXmlSerializable

public System.Xml.Schema.XmlSchema GetSchema()
{
return null;
}
public void WriteXml(XmlWriter writer)
{
MemoryStream fs = new MemoryStream();
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(fs, itemsConf);
byte[] bytesArray = fs.ToArray();
int SizeDictionary = bytesArray.Length;

writer.WriteStartElement("size_dic");
writer.WriteValue(SizeDictionary);
writer.WriteEndElement();
writer.WriteStartElement("sam_dic");
writer.WriteBinHex(bytesArray, 0, bytesArray.Length);
writer.WriteEndElement();
}
public void ReadXml(XmlReader reader)
{
int val = 0;
while (reader.Read() == true)
{
if (reader.Name == "size_dic")
{
val = (int)reader.ReadElementContentAs(typeof(int), null);
break;
}
}
byte [] bytesArr = new byte[val];
if (reader.Name == "sam_dic")
{
reader.ReadElementContentAsBinHex(bytesArr, 0, val);
}
MemoryStream ms = new MemoryStream(bytesArr);
BinaryFormatter formattt = new BinaryFormatter();
this.itemsConf = (Dictionary<string, ConfigModule_2>)formattt.Deserialize(ms);
}

Благодарю за совет!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.