Разве вы не можете использовать свой собственный метод?
return vector.isEmpty() ? new Vector<?>() : vector;
Как Jon Skeet вполне правильно говорит, необходимо будет использовать IXmlSerializable
с XmlSerializer
если Вы не захотите сделать, чтобы общественность получила/установила для свойств, потому что она разработана для работы в частично-доверительной среде, то так не получит доступ ни к каким данным, к которым Вы, возможно, не получили доступ так или иначе (для ответа на его последнюю часть - да, некоторые структуры как DateTime
действительно имейте явную поддержку в том сериализаторе).
В зависимости от того, чего Вы пытаетесь достигнуть, и какую версию.NET Вы используете, Вы могли рассмотреть использование DataContractSerializer
который не требует вещей быть общедоступным (например, Вы могли поместить a DataMemberAttribute
на частном поле или свойстве с общедоступным методом считывания и частным методом set). Этот сериализатор дает Вам меньше контроля форматом XML (на самом деле, это очень строго - например, он даже не поддерживает атрибуты!), но несколько быстрее как окупаемость.
(Я долго страстно желал по чему-то, из чего это является комбинацией этих двух, т.е. гибкостью XmlSerializer
со способностью сериализировать членов парламента, не занимающих официального поста как DataContractSerializer
но к сожалению в данный момент нет того.)
Если бы возможно в этом сценарии, я использовал бы DataContractSerializer
(.NET 3.0), и я использовал бы что-то как:
[DataMember]
public int TestNumber1
{
get { return this.testNumber; }
set { this.testNumber = value;}
}
// note **not** a data-member
public InnerTest InnerTest
{
get { return this.innerTest; }
set { this.innerTest = value;}
}
[DataMember]
private int InnerTestValue
{
get {return innerTest.Number;}
set {innerTest = new InnerTest(value);}
}
таким образом обхождение проблемы. Можно сделать похожий с XmlSerializer
, но необходимо было бы сделать InnerTestValue
общественность (хотя Вы могли украсить его [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
- но это не идеально).
Конечно, если у Вас есть несколько значений на структуре... более хитрой. У Вас может быть несколько свойств контейнера, конечно, но это немного пестро. В основном [de] сериализация и неизменные объекты (поскольку структуры должны быть) не смешивают все настолько хорошо.
Другая опция состоит в том, чтобы поддержать отдельное ПОСТЕПЕННО версия, которая использует изменяемые классы повсюду, и переведите между двумя; снова, не очень привлекательный как опция для моделей большого объекта.
Я никогда не делал этого сам, но я подозреваю, что просто необходимо реализовать интерфейс IXmlSerializable.
Насколько я могу сказать, который означает, что необходимо сделать структуру изменяемой - который является болью. Идеально XmlSerializer должен распознать, имеет ли Ваш тип конструктора с определенной подписью, но поскольку это, кажется, не опция (насколько я вижу), стоило бы реализовать интерфейс с помощью явной интерфейсной реализации, чтобы, по крайней мере, отговорить пользователей использовать его непосредственно самих.
Интересно, как другие структуры (например, DateTime) справляются..., возможно, у них есть явная поддержка в XmlSerializer.
Можно определенно использовать XmlSerializer на объекте там и получить ожидаемый результат:
Test test = new Test { TestNumber1 = 5 };
XmlSerializer xmlSer = new XmlSerializer(typeof(Test));
MemoryStream memStm = new MemoryStream();
xmlSer.Serialize(memStm, test);
Для проверки результата считайте поток памяти снова в строку и посмотрите на него в отладчике (или выпишите его в файл):
StreamReader stmR = new StreamReader(memStm);
memStm.Position = 0;
string output = stmR.ReadToEnd();
Если Вы не сделаете ничего специального, то все общественные собственности класса, который Вы сериализируете, будут представлены как элементы XML..... в Вашем получающемся XML.
Существует набор атрибутов как [XmlIgnore] и намного больше настраивать это по мере необходимости.
Приятного отдыха!