Настроить вывод из XmlSerializer в C # - PullRequest
2 голосов
/ 02 сентября 2011

Мне интересно, есть ли способ получить XmlSerializer в C #, чтобы изменить то, что он выводит для одного свойства одного объекта.Например, если у меня есть что-то вроде:

public class MyClass
{
    public string prop1{get;}
    public uint prop2{get;}
    public MyClass2 class2{get;}
    public MyClass3 class3{get;}
}

public class MyClass2
{
    public string prop3{get;}
}

public class MyClass3
{
    //Lots of properties that I want to serialize as normal
}

Теперь где-то в моем коде, у меня есть что-то вроде этого:

private void SerializeStuff(List<MyClass> list, string path)
{
    XmlSerializer serialize = new XmlSerializer(typeof(List<MyClass>));
    TextWriter writer = new StreamWriter(path);
    serialize.Serialize(writer, list);
    writer.Close();
}

Я хочу, чтобы сериализация работала какнормально, но с заменой prop3 на другие вещи.Пример:

<MyClass>
    <prop1>whatever</prop1>
    <prop2>345</prop2>
    <class2>
        <somethingNotProp3>whatever</somethingNotProp3>
        <somethingElseNotProp3>whatever</somethingElseNotProp3>
    </class2>
    <class3>
        ...
    </class3>
</MyClass>

Есть ли способ настроить XmlSerializer, чтобы мне не приходилось писать весь XML-файл вручную, или нет способа это сделать?

Редактировать: IЯ почти уверен, что решение может быть связано с реализацией метода ISerializable GetObjectData;Однако я не совсем уверен, как это реализовать.Я попытался сделать MyClass2 наследованным от ISerializable и внедрить GetObjectData, но ничего не изменилось.prop3 все еще выводился в файле XML.

1 Ответ

3 голосов
/ 02 сентября 2011

Используйте атрибуты в пространстве имен System.Xml.Serialization , чтобы повлиять на способ сериализации экземпляра.

Если вам нужна очень специализированная сериализация для MyClass3, которую атрибуты не могут обработать, то реализуйте интерфейс IXmlSerializable , который даст вам полный контроль над процессом сериализации (вы даже можете выбрать экземпляр в порядке экземпляра, как сериализовать контент / свойство).

На основании комментариев может показаться, что вы хотите реализовать IXmlSerializable, поскольку вы хотите изменить имя свойства и значение; атрибуты позволят вам изменить имя свойства / элемента / атрибута, но не позволят вам выполнить преобразования значения (и я предполагаю, что вы не хотите портить представление и добавлять для этого дополнительное свойство / значение) .

...