Мне нравится автоматическая сериализация 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)" не является константой. Возможно, я просто не могу понять этот синтаксис атрибутов. Как я могу заставить его работать? Этот вопрос касается комфорта кодирования, поэтому меня не интересуют такие решения, как "написать собственный код сериализации" или другие предложения, которые приводят к длительному коду. Если вы знаете, что это не работает с автоматической системой сериализации, которая также будет ответом.
ваш ответ, скорее всего, в этом посте.
В нем объясняется, как создать логический метод, который возвращает, должен ли этот элемент быть сериализован.
В таких случаях вы можете использовать трюк для сериализации другого типа.
[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
является наиболее подходящей) для преобразования в/из.
xml
, который затем будет строкой для сериализации с class ToSerialize
). Пойнт вы можете определить значение по умолчанию, потому что это то , что Shift
будет иметь (если Shift
отсутствует в XML, то _Shift
сеттер не называется).
default(Vector2)
? Это будет иметь те же значения. Кроме того, изменяемые типы значений - ick ...