2009-02-10 11 views
6

Czy w jakiś sposób można użyć XmlSerializer do deserializacji jego danych do istniejącej instancji klasy, a nie do nowej?Jak korzystać z XmlSerializer do deserializacji do istniejącej instancji?

Byłoby to pomocne w dwóch przypadkach:

  1. łatwo połączyć dwa pliki XML do jednej instancji obiektu.
  2. Pozwól konstruktorowi obiektów sam być tym, który ładuje swoje dane z pliku XML.

Jeśli nie jest to możliwe domyślnie, powinno działać za pomocą odbicia (kopiowanie każdej właściwości po deserializacji), ale byłoby to brzydkie rozwiązanie.

Odpowiedz

1

myślę, że jesteś na dobrej drodze z ideą refleksji.

Ponieważ prawdopodobnie i tak masz dookoła operacje XML, możesz wziąć obiekt docelowy, normalnie przekształcić deserializację w nowy obiekt, a następnie zrobić coś podobnego do klonowania, kopiując pojedynczo tylko te -domyślne wartości.

To nie powinno być tak skomplikowane, aby to wdrożyć, i będzie wyglądać dla konsumentów od reszty aplikacji, podobnie jak w przypadku deserializacji w miejscu.

4

Zasadniczo nie można. XmlSerializer jest ściśle konstruktywny. Jedyną interesującą rzeczą, którą możesz zrobić, aby dostosować XmlSerializer, jest implementacja IXmlSerializable i zrobienie wszystkiego samemu - nie jest to atrakcyjna opcja (i nadal będzie tworzyć nowe instancje z domyślnym konstruktorem itp.).

Czy xml jest wymaganiem ścisłym? Jeśli można użyć innego formatu, protobuf-net wsporniki łączące fragmenty z istniejącymi przypadkach, jako po prostu jako:

Serializer.Merge(source, obj); 
0

Uderzyłem ten sam problem kilka tygodni temu.

Wprowadziłem metodę Deserialize (ciąg szeregowany w postaci ciągów znaków) w interfejsie ISelfSerializable, którą zaimplementowano w klasie encji. Upewniłem się również, że interfejs wymusił na klasie domyślny konstruktor.

W mojej fabryce stworzyłem obiekt tego typu, a następnie zserializowałem ciąg znaków do niego.

0

To nie jest wątku bezpieczne rzecz do zrobienia ... Ale można zrobić:

[Serializable] 
public class c_Settings 
{ 
    static c_Settings Default; 
    public static SetExistingObject(c_Settings def) 
    { 
     Default = def; 
    } 

    public string Prop1; 
    public bool Prop2; 

    public c_Settings() 
    { 
     if (Default == null) 
      return; 
     MemberInfo[] members = FormatterServices.GetSerializableMembers(typeof(c_Settings)); 
     FormatterServices.PopulateObjectMembers(this, members, FormatterServices.GetObjectData(Default, members)); 
    } 
} 

ten sposób karmić obiekt do deserialiser i deserialiser nadpisuje tylko to co jest napisane w .xml.

Powiązane problemy