Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WinForms, .Net Framework Новый топик    Ответить
 Конструктор XmlSerializer не получается вызвать для произвольного объекта  [new]
AlexV1
Member

Откуда: Новосибирск
Сообщений: 589
Хочу сериализовать произвольный obj1.
Он может быть любого класса, помеченного как [Serializable]

public static bool Func1(object obj1)
{
   ...
  XmlSerializer xmlser = new XmlSerializer(typeof(Person));  // Но указать класс Person - это жестко. Хочется сделать гибче
}

Можно ли как то, например зная имя класса объекта obj1 в переменной

string ClassName = "Person";

вызвать конструктор XmlSerializer, используя эту переменную?

ну или иным способом как то...
15 мар 19, 19:03    [21834244]     Ответить | Цитировать Сообщить модератору
 Re: Конструктор XmlSerializer не получается вызвать для произвольного объекта  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 4710
AlexV1,

public static bool Func1(object obj1)
{
  ...
  XmlSerializer xmlser = new XmlSerializer(obj1?.GetType() ?? throw new ArgumentNullException(nameof(obj1)));
  ...
}
15 мар 19, 19:31    [21834271]     Ответить | Цитировать Сообщить модератору
 Re: Конструктор XmlSerializer не получается вызвать для произвольного объекта  [new]
AlexV1
Member

Откуда: Новосибирск
Сообщений: 589
Сон Веры Павловны,

спасибо.

Теперь выдало на этой строке вот что

NotSupportedException: Невозможно сериализовать член Common.ConfData.typeRec типа System.Collections.Generic.Dictionary`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[Common.TypeRec, common, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]], т. к. он содержит реализацию IDictionary.

что можно сделать с членом Dictionary, чтоб сериализовался?
15 мар 19, 19:41    [21834281]     Ответить | Цитировать Сообщить модератору
 Re: Конструктор XmlSerializer не получается вызвать для произвольного объекта  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 4710
AlexV1
что можно сделать с членом Dictionary, чтоб сериализовался?

Ничего - у XmlSerializer'а достаточно жесткие требования к начинке класса, и без доп. телодвижений здесь ничего не сделать. Например, вот таких. Возможно, придется сделать часть логики именно для сериализации, а часть контракта класса пометить атрибутом XmlIgnore. Ну, либо наколхозить свою сериализацию в XML - часто ручная потеговая-поатрибутная запись в выходной stream бывает оптимальнее и гибче, чем стандартная xml-сериализация.
15 мар 19, 21:35    [21834346]     Ответить | Цитировать Сообщить модератору
 Re: Конструктор XmlSerializer не получается вызвать для произвольного объекта  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3305
я даже больше скажу, для каждого типа, XmlSerializer создает в памяти отдельную сборку\программу и загружает её в память, после чего с помощью этого кода сериализует\десериализует объекты. То есть, сам сериализатор универсальный, но он генерирует очень узко специализированный код для заданного типа
15 мар 19, 21:44    [21834351]     Ответить | Цитировать Сообщить модератору
 Re: Конструктор XmlSerializer не получается вызвать для произвольного объекта  [new]
AlexV1
Member

Откуда: Новосибирск
Сообщений: 589
Спасибо за ответы.
С XmlSerializer действительно не все просто.
16 мар 19, 06:26    [21834476]     Ответить | Цитировать Сообщить модератору
Все форумы / WinForms, .Net Framework Ответить