2017-01-09 2 views
1

я не могу найти причину, почему свойства без добытчиков не разбор должным образом, позволь мне написать пример:C# - XML ​​десериализация свойств

Для XML в формате

<request> 
    <job 
    mode="modefirst" 
    /> 
<request> 

Я пытаюсь десериализации его к POCO со свойством:

private ESomeEnum emode; 

    [XmlAttribute(AttributeName = "mode")] 
    public string Mode 
    { 
     set { ESomeEnum.TryParse(blah blah); 
    } 

emode создается для значения по умолчанию в конструкторе класса, в то время как десериализации (System.Xml.Serialization без пользовательских классов, просто пытаюсь быть минималистичный здесь) XML-сверху, сеттер никогда не называют, но когда свойство «Mode» содержит поглотитель

get { return this.emode.ToString(); } 

сеттер фактически удара и правильное значение, установленное во время десериализации.

Зачем возникает эта ситуация? Есть ли причина в этом?

+3

Публичные свойства должны иметь сериализацию и сеттеры. См. [Почему моя публичная собственность не сериализована XmlSerializer?] (Https://stackoverflow.com/questions/575432/why-isnt-my-public-property-serialized-by-the-xmlserializer). – dbc

ответ

1

Объекты только, которые имеют общедоступные приемники доступа. Но вы можете настроить все, выполнив IXmlSerializable:

public class MyXmlSerializableClass : IXmlSerializable 
{ 
    private ESomeEnum emode = ESomeEnum.modefirst; 

    public string Mode 
    { 
     set { emode = ESomeEnum.Parse(value); } 
    } 

    public int ReadWriteProperty { get; set; } 

    public int SemiReadOnlyProperty { get; private set; } 

    private int backingFieldOfRealReadOnlyProperty; 
    public int RealReadOnlyProperty 
    { 
     get { return backingFieldOfRealReadOnlyProperty; } 
    } 

    #region IXmlSerializable Members 

    public System.Xml.Schema.XmlSchema GetSchema() 
    { 
     throw new NotImplementedException(); 
    } 

    public void ReadXml(XmlReader reader) 
    { 
     if (reader.Settings != null && !reader.Settings.IgnoreWhitespace) 
     { 
      reader = XmlReader.Create(reader, new XmlReaderSettings { IgnoreWhitespace = true }); 
      reader.Read(); 
     } 

     reader.ReadStartElement(); 
     Mode = reader.ReadElementContentAsString("Mode", String.Empty); 
     ReadWriteProperty = reader.ReadElementContentAsInt("ReadWriteProperty", String.Empty); 
     SemiReadOnlyProperty = reader.ReadElementContentAsInt("ReadOnlyAutoProperty", String.Empty); 
     backingFieldOfRealReadOnlyProperty = reader.ReadElementContentAsInt("ReadOnlyProperty", String.Empty); 
    } 

    public void WriteXml(XmlWriter writer) 
    { 
     writer.WriteElementString("Mode", emode.ToString()); 
     writer.WriteElementString("ReadWriteProperty", ReadWriteProperty.ToString(CultureInfo.InvariantCulture)); 
     writer.WriteElementString("ReadOnlyAutoProperty", SemiReadOnlyProperty.ToString(CultureInfo.InvariantCulture)); 
     writer.WriteElementString("ReadOnlyProperty", RealReadOnlyProperty.ToString(CultureInfo.InvariantCulture)); 
    } 

    #endregion 

    internal MyXmlSerializableClass() 
    {/*needed for deserialization*/ 
    } 
} 
+0

Итак, по умолчанию конфигурация интерфейса по умолчанию отражает только ReadWriteProperties, я должен сначала взглянуть на источник. Спасибо за этот хороший пример, я буду использовать его в качестве отправной точки. – Vilo

Смежные вопросы