2011-03-11 1 views
5

가상 속성이있는 기본 클래스와 가상 속성을 재정의하는 파생 된 형식이 있습니다. 형식을 XML로 serialize 할 수 있습니다. 내가 뭘 하려는지 개체가 파생 된 유형의 경우 항목 속성 목록을 유지하지 않는 것입니다. 이를 달성하기 위해 파생 클래스는 [XmlIgnore] 특성으로 재정의 된 속성을 꾸며냅니다. 기본 클래스의 가상 속성은 XmlIgnore 특성을 적용하지 않습니다. 개체가 파생 형식 (DynamicCart) 일 때도 항목 목록이 어떤 이유로 직렬화됩니다..NET의 XmlSerializer를 사용할 때 파생 클래스의 속성을 무시합니다.

기본 클래스의 가상 속성에 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>); 
} 
+0

질문에 대한 답변을 본 것으로 보입니다. –

+0

나는 주위의 해결 방법을 구현했지만 내 질문에 대한 대답이 아니며 XMLSerializer는 Serive 클래스의 [XMLIgnore] 특성을 따르지 않고 DynamicCart를 serialize 할 때 List 개체를 포함합니까? – Ken

답변

-1

XML 직렬화의 기본 클래스에서 파생 형식을 선언해야한다고 생각합니다. 약간 어리석은 소리지만 사양에 의한 것입니다.

MSDN page 참조, 다음과 같은 예를 들어 보면 :

[System.Xml.Serialization.XmlInclude(typeof(Derived))] 
public class Base 
{ 
    // ... 
} 
+0

이 속성을 클래스에 추가해도 문제가 해결되지 않았습니다. serializer는 파생 클래스의 재정의 된 속성에 [XMLIgnore] 특성이 있더라도 List 을 계속 serialize합니다. 마침내 끝났다. 파생 클래스에서 재정의 된 속성을 제거합니다. 파생 클래스가 직렬화되는 경우 XMLIgnore 속성을 적용하기 위해 조건부 직렬화 논리를 기본 클래스에 작성하는 것입니다. – Ken

+0

왜 serilizer가 파생 클래스의 [XMLIgnore] 특성을 따르지 않는지에 대한 단서가 있습니까 ?? – Ken

-1

이이

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

이 당신이 많은 유형을 추가 할 수 있도록하려고하면 시리얼이 inclusde 싶습니다.

0

당신의 serializer가 파생 된 대신 기본 클래스를 사용하고 있다고 생각합니다.

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

당신은 기본 클래스에 가상 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... 후에 고려하는 것이 포함되어 있습니다.

관련 문제