2013-08-14 32 views
28

W języku C#, jak mogę uczynić XmlSerializer zignorować właściwość podczas serializacji, ale nie podczas deserializacji? (? Albo jak mam zrobić to samo z Json.NET)Zignoruj ​​właściwość podczas serializacji xml, ale nie podczas deserializacji.

Aby zapobiec nieruchomości od bycia w odcinkach, można dodać atrybut XmlIgnore:

[XmlIgnore] 
public int FooBar {get;set;} 

To spowoduje tag <FooBar> zostać pominięte podczas serializacja.

Oznacza to jednak, że znacznik <FooBar> zostanie zignorowany podczas deserializacji.

W moim przypadku akceptuję tablicę elementów od użytkownika w żądaniu, a dla każdego elementu użytkownik może określić właściwość akcji, jeśli chce dodać, zmodyfikować lub usunąć pozycję. Chcę używać tego samego obiektu modelu do wywoływania list GET i nie chcę zwracać tej właściwości akcji. Oczekuję, że będzie to dość powszechny przypadek.

Kolejny przypadek użycia: że masz obiekt circle

public class Circle 
{ 
    public double Radius { get; set; } 
} 

i zmodyfikować go dodać obiekt średnicy

public class Circle2 
{ 
    public double Diameter { get; set; } 
    public double Radius { get { return Diameter/2; } set { Diameter = value*2; } } 
} 

może chcesz serializacji tylko średnicę, ale nadal być można deserializować pliki xml w starym formacie, które zawierają tylko promień.

zrobiłem moje badania i nie znaleźliśmy niczego, stąd to pytanie

Rozwiązanie: zorientowali się rozwiązanie. Mogę dodać obiekt ShouldSerialize który zawsze return false, szczegóły na this MSDN documentation

(rozwiązanie to może być dodany jako rzeczywistą odpowiedź, jeśli ta kwestia jest ponownie)

+0

Jak można nie serializować, ale następnie spodziewać się deserializacji? – Justin

+0

Podaj właściwość wartość domyślną? .. Jak inaczej "nie ignoruj" właściwość podczas deserializacji? – dasblinkenlight

+0

Jestem zbyt leniwy, aby przeszukać dokumenty już teraz, ale jeśli przejrzysz dokumentację json.NET, gwarantuję, że ma przykłady pokazujące, jak zignorować właściwość podczas serializacji/deserializacji. – evanmcdonnal

Odpowiedz

15

Jeśli chcesz zignorować element z serializacji z XmlSerializer, można użyć XmlAttributeOverrides:

XmlAttributeOverrides overrides = new XmlAttributeOverrides(); 
XmlAttributes attribs = new XmlAttributes(); 
attribs.XmlIgnore = true; 
attribs.XmlElements.Add(new XmlElementAttribute("YourElementName")); 
overrides.Add(typeof(YourClass), "YourElementName", attribs); 

XmlSerializer ser = new XmlSerializer(typeof(YourClass), overrides); 
ser.Serialize(... 
+0

Dziękuję Fcuesta, ale XmlIgnore dotyczyłoby zarówno serializacji, jak i deserializacji. Szukam sposobu, aby móc deserializować, jeśli właściwość jest dostarczana, ale nigdy serializować go. – Manoj

+3

Podczas serializacji: XmlSerializer ser = new XmlSerializer (typeof (YourClass), przesłanianie); przy deserializacji użyj XmlSerializer ser = new XmlSerializer (typeof (YourClass)); bez parametru przesłaniania – fcuesta

+0

Dzięki. Ten mechanizm nie jest bardzo intuicyjny. – xr280xr

19

jest to rozwiązanie przedstawione przez Manoj:

Jeśli chcesz stłumić serializacji o W przypadku konkretnej właściwości Foo, ale nadal można ją przekształcić, można dodać metodę, która zawsze zwraca wartość false.

przykład:

public class Circle2 
{ 
    public double Diameter { get; set; } 
    public double Radius { get { return Diameter/2; } set { Diameter = value*2; } } 

    [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] 
    public bool ShouldSerializeRadius() {return false;} 
} 

Spowoduje to, że promień nie jest w odcinkach, ale pozwala na jego rozszeregować.

Ta metoda musi być publiczna dla XMLSerializer, aby ją znaleźć, więc aby uniknąć zanieczyszczania przestrzeni nazw, możesz dodać atrybut EditorBrowsable, aby ukryć go przed IDE. Niestety to ukrywanie działa tylko wtedy, gdy zbiór jest odwoływany jako biblioteka DLL w bieżącym projekcie, ale nie, jeśli edytujesz rzeczywisty projekt za pomocą tego kodu.

+0

Jest to niezwykle przydatne . – rolls