Сериализация класса, содержащего DataTable, в C#

Можно ли сериализовать класс, имеющий свойство типа DataTable?

Пример:

public class MyMessage
{ 
    public DataTable Fields { get; set; }

    public string Code { get; set; }
    public string Name { get; set; }

}

Скорее всего свойство DataTable должно быть украшено атрибутами, но как?

Вот мой код:

XmlSerializer xs = new XmlSerializer(typeof(MyMessage));
StringWriter sw = new StringWriter();
var str = xs.Serialize(sw, msg);

Я получаю исключение: Не удается сериализовать DataTable. Имя DataTable не задано.


person iljon    schedule 14.02.2018    source источник
comment
Является ли это возможным? Ты пробовал?   -  person Chetan Ranpariya    schedule 14.02.2018
comment
Я думаю, что это возможно, но помимо данных есть и другие поля. Я считаю, что это не то, что вы хотите   -  person novac    schedule 14.02.2018
comment
Какая сериализация? Существует DataTable.WriteXml msdn.microsoft.com/en -нас/библиотека/   -  person Nekeniehl    schedule 14.02.2018
comment
DataTable равно [Serializable] , у вас есть исключение или почему вы задаете этот вопрос? Обычно, если есть свойство несериализуемого типа, вы создаете другое свойство в геттере/сеттере, из которого вы конвертируете в/из несериализуемого типа и получаете/устанавливаете исходное значение свойства (при этом исходное свойство помечается [XmlIgnore]).   -  person Sinatr    schedule 14.02.2018
comment
Похоже на дубликат Не удается сериализовать DataTable. Имя DataTable не задано или Почему не удается сериализовать DataTable. Имя DataTable не задано?. Вы пытались установить DataTable.TableName на что-то, рекомендованное этими ответами и самим сообщением об исключении?   -  person dbc    schedule 14.02.2018


Ответы (1)


Отметьте MyMessage как сериализуемое, а затем вот так:

 MyMessage test = new MyMessage();
 DataTable table = new DataTable();
 table.TableName = "test";
  ...init...
  test.Fields = table;
  using (Stream fs = new FileStream("Test.xml", FileMode.Create))
  {
    XmlTextWriter writer = new XmlTextWriter(fs, Encoding.UTF8);
    writer.Formatting = Formatting.Indented;
    new XmlSerializer(typeof(MyMessage)).Serialize(writer, test);
  }
person Flocke    schedule 14.02.2018
comment
XmlSerializer игнорирует атрибут [Serializable], нет необходимости отмечать MyMessage как сериализованное. Что необходимо, так это установить table.TableName. - person dbc; 14.02.2018