Глубокие xml сериализируют структуру Опции

Разве вы не можете использовать свой собственный метод?

 return vector.isEmpty() ? new Vector<?>() : vector;
5
задан 15 January 2009 в 07:19
поделиться

4 ответа

Как Jon Skeet вполне правильно говорит, необходимо будет использовать IXmlSerializable с XmlSerializer если Вы не захотите сделать, чтобы общественность получила/установила для свойств, потому что она разработана для работы в частично-доверительной среде, то так не получит доступ ни к каким данным, к которым Вы, возможно, не получили доступ так или иначе (для ответа на его последнюю часть - да, некоторые структуры как DateTime действительно имейте явную поддержку в том сериализаторе).

В зависимости от того, чего Вы пытаетесь достигнуть, и какую версию.NET Вы используете, Вы могли рассмотреть использование DataContractSerializer который не требует вещей быть общедоступным (например, Вы могли поместить a DataMemberAttribute на частном поле или свойстве с общедоступным методом считывания и частным методом set). Этот сериализатор дает Вам меньше контроля форматом XML (на самом деле, это очень строго - например, он даже не поддерживает атрибуты!), но несколько быстрее как окупаемость.

(Я долго страстно желал по чему-то, из чего это является комбинацией этих двух, т.е. гибкостью XmlSerializer со способностью сериализировать членов парламента, не занимающих официального поста как DataContractSerializer но к сожалению в данный момент нет того.)

2
ответ дан 14 December 2019 в 13:49
поделиться

Если бы возможно в этом сценарии, я использовал бы 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] сериализация и неизменные объекты (поскольку структуры должны быть) не смешивают все настолько хорошо.

Другая опция состоит в том, чтобы поддержать отдельное ПОСТЕПЕННО версия, которая использует изменяемые классы повсюду, и переведите между двумя; снова, не очень привлекательный как опция для моделей большого объекта.

2
ответ дан 14 December 2019 в 13:49
поделиться

Я никогда не делал этого сам, но я подозреваю, что просто необходимо реализовать интерфейс IXmlSerializable.

Насколько я могу сказать, который означает, что необходимо сделать структуру изменяемой - который является болью. Идеально XmlSerializer должен распознать, имеет ли Ваш тип конструктора с определенной подписью, но поскольку это, кажется, не опция (насколько я вижу), стоило бы реализовать интерфейс с помощью явной интерфейсной реализации, чтобы, по крайней мере, отговорить пользователей использовать его непосредственно самих.

Интересно, как другие структуры (например, DateTime) справляются..., возможно, у них есть явная поддержка в XmlSerializer.

1
ответ дан 14 December 2019 в 13:49
поделиться

Можно определенно использовать 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] и намного больше настраивать это по мере необходимости.

Приятного отдыха!

1
ответ дан 14 December 2019 в 13:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: