Как приписать элемент структуры со значением по умолчанию для сериализации XML в C #

1

Мне нравится автоматическая сериализация xml открытых элементов в С#. Это экономит ваше время. Но теперь я, возможно, достиг пределов, или вы знаете, как это сделать?

То, что я хочу достичь, состоит в том, что ничего не написано для члена, когда оно имеет значение по умолчанию. Это легко со стандартным типом типа "int", например:

[XmlElement(ElementName = "Test", IsNullable = false), DefaultValue(0)]
public int Test = 0;

До тех пор, пока "Тест" равен 0, ничего не записывается при сериализации.

Но как насчет структур как членов? Например:

    public struct Vector2 {
        public float x;
        public float y;

        public Vector2(float x = 0.0f, float y = 0.0f) {
           this.x = x;
           this.y = y;
        }
        ...
    }

    public class ToSerialize {
        [XmlElement(ElementName = "Shift", IsNullable = false), DefaultValue(new Vector2(0,0))]
        public Vector2 Shift = new Vector2(0, 0);
        ...
    }

Это не работает, потому что "новый вектор2 (0,0)" не является константой. Возможно, я просто не могу понять этот синтаксис атрибутов. Как я могу заставить его работать? Этот вопрос касается комфорта кодирования, поэтому меня не интересуют такие решения, как "написать собственный код сериализации" или другие предложения, которые приводят к длительному коду. Если вы знаете, что это не работает с автоматической системой сериализации, которая также будет ответом.

  • 0
    Вы пробовали по default(Vector2) ? Это будет иметь те же значения. Кроме того, изменяемые типы значений - ick ...
  • 0
    Компилятор говорит, что «default (Vector2)» также не является константой :-(
Показать ещё 1 комментарий
Теги:
serialization

2 ответа

0
Лучший ответ

ваш ответ, скорее всего, в этом посте.

В нем объясняется, как создать логический метод, который возвращает, должен ли этот элемент быть сериализован.

  • 0
    Ответы должны быть в значительной степени автономны - это не дает никакой полезной информации , не пройдя по ссылке. Вы должны извлечь соответствующее резюме в свой ответ ... или просто добавить ссылку в качестве комментария к вопросу.
  • 0
    понял, извини
Показать ещё 2 комментария
1

В таких случаях вы можете использовать трюк для сериализации другого типа.

[XmlIgnore]
public Vector2 Shift = new Vector2(0, 0);

[XmlElement("Shift")] // to have same name as original field/property
public string _Shift
{
    get { return ...; } // convert Vector2 to string
    set { Shift = ... value; } // opposite
}

Вам нужно будет выбрать тип (обычно string является наиболее подходящей) для преобразования в/из.

  • 0
    Я использовал этот трюк в некоторых случаях. Но на более сложных структурах, которые могут иметь свои собственные свойства сериализации, практически невозможно преобразовать их в строку.
  • 0
    Затем вы можете преобразовать их в xml , который затем будет строкой для сериализации с class ToSerialize ). Пойнт вы можете определить значение по умолчанию, потому что это то , что Shift будет иметь (если Shift отсутствует в XML, то _Shift сеттер не называется).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню