Игнорирование свойств в производных классах при использовании .NET XmlSerializer - PullRequest
7 голосов
/ 11 марта 2011

У меня есть базовый класс с виртуальным свойством и производным типом, который переопределяет виртуальное свойство. Тип может быть сериализован в XML. То, что я пытаюсь сделать, это НЕ сохранять свойство List of items, когда объект имеет производный тип. Чтобы добиться этого, производный класс украшает переопределенное свойство атрибутом [XmlIgnore]. Виртуальное свойство в базовом классе НЕ применяет атрибут XmlIgnore. По какой-то причине список элементов сериализуется каждый раз, даже когда объект имеет производный тип (DynamicCart).

Когда я применяю атрибут XmlIgnore к виртуальному свойству в базовом классе, список не сериализуется в файл.

public class ShoppingCart
{  
   public virtual List<items> Items{get; set;}

   //and other properties 

   public void SerializeToXML (string filePath)
   {
     var xmlSerializer = new XmlSerializer(this.GetType());
     textWriter = new System.IO.StreamWriter(filePath);
     xmlSerializer.Serialize(textWriter, this);
     textWriter.Flush();
     textWriter.Close();  
   }
}

//A cart that is populated by algo based on parameters supplied by user. I have no need to
//persist the actual items across sessions.
class DynamicCart: ShoppingCart
{
   [XmlIgnore]
   public override List<items>{get;set;}
   //and other properties 
}

class Shop
{
   ShoppingCart cart = new DynamicCart();
   PopulateCart(cart);
   cart.serializeToXML(<PATH TO FILE>);
}

Ответы [ 4 ]

1 голос
/ 24 июля 2015

Вы можете сделать это, добавив виртуальный метод ShouldSerialize*** в базовый класс.Например:

[XmlInclude(typeof(Sub))]
public class Base
{
    public virtual string Prop { get; set; }

    public virtual bool ShouldSerializeProp() { return true; }
}

public class Sub : Base
{
    public override string Prop { get; set; }

    public override bool ShouldSerializeProp() { return false; }
}

internal class Program
{
    private static void Main()
    {
        var o = new Sub { Prop = "Value" };

        var baseSer = new XmlSerializer(typeof (Base));
        var subSer = new XmlSerializer(typeof (Sub));

        Console.Out.WriteLine("BASE:");
        baseSer.Serialize(Console.Out, o);
        Console.Out.WriteLine();

        Console.Out.WriteLine("SUB:");
        subSer.Serialize(Console.Out, o);
        Console.Out.WriteLine();

        Console.ReadLine();
    }
}

При этом получается (слегка прибрано):

BASE:
<Base xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Sub">
  <Prop>Value</Prop>
</Base>

SUB:
<Sub />

В методе должно быть указано точное имя свойства, которое следует учитывать после ShouldInclude....

0 голосов
/ 11 марта 2011

Попробуйте это

  XmlSerializer serializer = new XmlSerializer(typeof(DynamicCart), new Type[]{typeof(ShoppingCart)});

это позволит вам добавить столько типов, сколько вы хотите, чтобы сериализатор включал.

0 голосов
/ 15 августа 2012

Я думаю, ваш сериализатор использует ваш базовый класс вместо производного.

public void SerializeToXML(string filePath, Type type)
{
    xmlSerializer = new XmlSerializer(type);
    textWriter = new System.IO.StreamWriter(filePath);
    xmlSerializer.Serialize(textWriter, this);
    textWriter.Flush();
    textWriter.Close();
}

class Shop
{
    ShoppingCart cart= new DynamicCart();
    PopulateCart(cart);
    cart.serializeToXML(<PATH TO FILE>, typeof(DynamicCart));
}
0 голосов
/ 11 марта 2011

Полагаю, вам нужно объявить производный тип в базовом классе для сериализации XML.Звучит немного глупо, но по спецификации.

См. Эту страницу MSDN и найдите следующий пример:

[System.Xml.Serialization.XmlInclude( typeof( Derived ) )]
public class Base
{
    // ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...