2011-06-18 6 views
6

Próbuję wygenerować dokument xml w określonym formacie. Chciałbym pominąć serializowanie właściwości w zależności od wartości właściwości.Serializacja XML Dynamic Ignore

public class Parent 
{ 
    public Parent() 
    { 
     myChild = new Child(); 
     myChild2 = new Child() { Value = "Value" }; 
    } 
    public Child myChild { get; set; } 
    public Child myChild2 { get; set; } 
} 

public class Child 
{ 
    private bool _set; 
    public bool Set { get { return _set; } } 

    private string _value = "default"; 
    [System.Xml.Serialization.XmlText()] 
    public string Value 
    { 
     get { return _value; } 
     set { _value = value; _set = true; } 
    } 
} 

System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(typeof(Parent)); 
x.Serialize(Console.Out, new Parent()); 

Jeśli ustawione jest fałszywa, chcę cała nieruchomość nie być w odcinkach mój wynikające xml powinien być

<Parent> 
    <myChild2>default</myChild2> 
</Parent> 

Zamiast

<Parent> 
    <myChild/> 
    <myChild2>default</myChild2> 
</Parent> 

Czy jest jakiś sposób mogę zrobić Czy to czysto z IXmlSerializable czy cokolwiek innego?

Dzięki!

Odpowiedz

6

Jest ShouldSerialize * wzór (wprowadzone przez TypeDescriptor, ale uznana przez kilku innych obszarach, takich jak kod XmlSerializer):

public bool ShouldSerializemyChild() { 
    return myChild != null && myChild.Set; 
} 

To powinno rozwiązać.

Jednak prostszą opcją jest przypisanie jej wartości NULL.

+0

Mam wiele właściwości, które wszystkie są typu Dziecka, wolałbym nie mieć ShouldSerialize dla każdego jednego. Mogę ustawić wszystkie moje właściwości na null, które nie są ustawione przed serializacją .. – TrevDev

+0

Wysłałem odpowiedź na dynamiczne ustawienie wartości na null za pomocą metody, która byłaby wywoływana przed serializacją. Czy masz lepszy pomysł na przypisanie wartości pustej? – TrevDev

+0

@Thx not really ... –

0

Jeśli "mychild" jest zdefiniowany przez tablicę, myślę, że można to zrobić dobrze ...

public class Parent 
{ 
    public Parent() 
    { 
     myChild = new Child[]{ new Child(){Value = "Value"}}; 
     //myChild2 = new Child() { Value = "Value" }; 
    } 
    public Child[] myChild { get; set; } 
    //public Child myChild2 { get; set; } 
} 
0

myślę, że to może działać, choć migh trzeba overide metody equals

[DefaultValue(new Child())] 
public Child myChild{ get; set; } 
+0

Argumenty atrybutów muszą być stałe – TrevDev

0

Po prostu napisałem ten kod dla zabawy i może nauczyłem się czegoś w tym procesie. Powinien ustawić dowolną właściwość na wartość null, jeśli ta właściwość zawiera metodę o nazwie Set, która zwraca wartość bool, a jej bieżącą wartością jest false. Ustawienie wartości na false powinno rozwiązać problem serializera. Wszelkie sugestie:

public static void RemoveUnsetObjects(object currentObject) 
{ 
    var type = currentObject.GetType(); 
    if (currentObject is IEnumerable) 
    { 
     IEnumerable list = (currentObject as IEnumerable); 
     foreach (object o in list) 
     { 
      RemoveUnsetObjects(o); 
     } 
    } 
    else 
    { 
     foreach (var p in type.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance)) 
     { 
      var propertyValue = p.GetValue(currentObject, null); 
      if (propertyValue == null) 
       continue; 
        var setPropInfo = p.PropertyType.GetProperty("Set", typeof(bool)); 
      if (setPropInfo != null) 
      { 
       var isSet = (bool)setPropInfo.GetValue(propertyValue, null); 
       if (!isSet) 
       { 
        p.SetValue(currentObject, null, null); 
       } 
      } 
      else 
      { 
       RemoveUnsetObjects(propertyValue); 
      } 
     } 
    } 
}