Как сериализовать пользовательский объект, агрегируя другие пользовательские объекты
Я пытаюсь сериализовать пользовательский объект в файл. Я много чего пробовал, но никто не работает, наверное, я что-то пропустил.
Здесь проблема.
У меня есть одноэлементный класс, который я использую для хранения своих объектов. Вот код:
using DataLibrary.Model.Tests;
using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization;
using System.Xml.Serialization;
using testsPsychotechniques.View;
namespace testsPsychotechniques.Model
{
[Serializable()]
public class testSaver : ISerializable
{
private String lastName;
private String firstName;
private List<ITest> tests;
public static testSaver Instance
{
get
{
return Nested.instance;
}
}
public void addTest(ITest test)
{
tests.Add(test);
}
public Boolean save()
{
try
{
FileStream file = File.Open(".\\result.data",
FileMode.Create,
FileAccess.ReadWrite,
FileShare.None);
XmlSerializer serializer = new XmlSerializer(typeof(testSaver));
serializer.Serialize(file, testSaver.Instance);
file.Close();
return true;
}
catch
{
return false;
}
}
private testSaver()
{
this.firstName = Identification.firstName;
this.lastName = Identification.lastName;
this.tests = new List<ITest>();
}
private class Nested
{
internal static readonly testSaver instance = new testSaver();
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("lastName", this.lastName);
info.AddValue("firstName", this.firstName);
info.AddValue("testsResults", this.tests);
}
}
}
Теперь настоящая проблема:
Когда я вызываю метод save, в сгенерированном XML-файле у меня есть только эти данные:
<?xml version="1.0"?>
<testSaver xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />
Классы, реализующие ITest
Все интерфейсы помечены как сериализуемые и имеют метод getObjectData.
Еще один намек на то, что функции getObjectData никогда не используются.
Спасибо за любую помощь
1 ответ
XmlSerializer
не использует [Serializable]
атрибут или ISerializable
интерфейс.
У вас есть два варианта здесь:
- Продолжайте использовать
XmlSerializer
в этом случае вам нужны открытые свойства и открытый конструктор noarg. - + Изменить
XmlSerializer
вSoapFormatter
и продолжать использовать либо[Serializable]
или жеISerializable
Вам не нужны оба.
Это действительно зависит от того, в каком формате вы хотите использовать Xml и предпочитаете ли вы атрибуты или код для управления сериализацией. Я бы выбрал вариант 1, так как он в целом проще.