2016-12-22 3 views
0

XmlSerializer игнорирует атрибуты класса. Я пишу простой сериализатор, и я использовал атрибуты [Serializable] и [NonSerialized], также я попытался использовать [XmlRoot] и [XmlIgnore]. И я заметил, хотя поле имеет атрибут [NonSerialized], он сериализуется.XmlSerializer игнорирует атрибуты

И также игнорирует другие атрибуты, такие как [XmAtribute]. Затем я заметил, что даже нет необходимости использовать какие-либо атрибуты, и я могу сериализовать класс без этих атрибутов, как я могу игнорировать некоторые поля?

Мой класс:

[Serializable] 
public class Route 
{ 
    int busNumber; 
    string busType, destination; 
    DateTime departure, arrival; 
    [NonSerialized]DateTime creationDate; 
    ... 
} 

И я пытаюсь сериализации List<Route>

private void saveToolStripMenuItem_Click(object sender, EventArgs e) 
{ 
    Stream stream = File.OpenWrite(Environment.CurrentDirectory + "\\routes.xml"); 
    XmlSerializer xmlSer = new XmlSerializer(typeof(List<Route>)); 
    xmlSer.Serialize(stream, ((FileForm)ActiveMdiChild).routes); 
    stream.Close(); 
} 
+0

Проверить это просто .Net Fiddle: https://dotnetfiddle.net/ljPoyJ – Piou

ответ

0

Попробуйте перекрывая сериализатором:

// Return an XmlSerializer used for overriding. 
    public XmlSerializer CreateOverrider() 
    { 
     // Create the XmlAttributeOverrides and XmlAttributes objects. 
     XmlAttributeOverrides xOver = new XmlAttributeOverrides(); 
     XmlAttributes attrs = new XmlAttributes(); 

     /* Setting XmlIgnore to false overrides the XmlIgnoreAttribute 
     applied to the Comment field. Thus it will be serialized.*/ 
     attrs.XmlIgnore = false; 
     xOver.Add(typeof(Group), "Comment", attrs); 

     /* Use the XmlIgnore to instruct the XmlSerializer to ignore 
     the GroupName instead. */ 
     attrs = new XmlAttributes(); 
     attrs.XmlIgnore = true; 
     xOver.Add(typeof(Group), "GroupName", attrs); 

     XmlSerializer xSer = new XmlSerializer(typeof(Group), xOver); 
     return xSer; 
    } 

    public void SerializeObject(string filename) 
    { 
     // Create an XmlSerializer instance. 
     XmlSerializer xSer = CreateOverrider(); 

     // Create the object to serialize and set its properties. 
     Group myGroup = new Group(); 
     myGroup.GroupName = ".NET"; 
     myGroup.Comment = "My Comment..."; 

     // Writing the file requires a TextWriter. 
     TextWriter writer = new StreamWriter(filename); 

     // Serialize the object and close the TextWriter. 
     xSer.Serialize(writer, myGroup); 
     writer.Close(); 
    } 

https://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlattributes.xmlignore.aspx

2

Я считаю, что вы ищете XmlIgnoreAttribute. Кроме того, свойства, которые должны быть сериализованы, должны быть объявлены как public.

Использование следующим образом:

public class Route 
{ 
    public int busNumber; 
    public string busType, destination; 
    public DateTime departure, arrival; 
    [XmlIgnore] 
    public DateTime creationDate; 

    // how to ignore a property 
    private int ignored; 
    [XmlIgnore] 
    public int Ignored { get { return ignored; } set { ignored = value; } } 
} 
+0

Да, ОФК, как я wroute я пытался использовать Xml конкретные atributes, и у меня есть прибудете/set properties. Это просто игнорирует любой атрибут. – Cheephs

+0

Вы объявляете все свои свойства «публичными»? Я просто подтвердил, что это необходимо для того, чтобы «XmlSerializer» мог их выписать. Атрибут 'XmlIgnore' добавляется к свойствам' public', которые вы не хотите сериализовать. – dana

+1

Да, спасибо, теперь это работает. – Cheephs

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