Frage

Ich möchte Objekte serialisiert und deserialisiert, ohne sich über die gesamte Klasse Graph zu kümmern.

Flexibilität ist der Schlüssel. Ich möchte in der Lage sein, jedes Objekt serialisiert zu mir vorbei ohne vollständige Attribute über die gesamten Objektgraphen benötigt.

  

Das bedeutet, dass binäre Serialisierung   ist keine Option, da es funktioniert nur mit   die anderen .NET-Plattformen. Ich würde   auch gerne etwas lesbar ein   Person und damit entzifferbar durch ein   Management-Programm und andere   Dolmetscher.

Ich habe festgestellt, Probleme mit der Datacontract, JSON und XML-Serializer.

  • scheinen die meisten dieser Fehler um Serialisierung von Listen / Wörterbücher zum Zentrum (dh XML Serializable Allgemein Wörterbuch ).
  • "Fügen Sie alle Arten nicht statisch bekannt in die Liste der bekannten Typen - für beispielsweise durch die Verwendung von Knowntype Attribut oder durch sie in die Liste der bekannten Hinzufügen Typen übergeben DataContractSerializer. "

Bitte stützen Sie Ihre Antworten auf tatsächlichen Erfahrungen und nicht Theorie oder das Lesen eines Artikels.

War es hilfreich?

Lösung

Haben Sie darüber nachgedacht, anstatt XML zu JSON Serialisierung?

Json.NET hat eine wirklich leistungsfähige und flexible Serializer, der keine Probleme hat mit Hashtables / generic Wörterbücher und erfordert keine besonderen Attribute. Ich weiß, weil ich es geschrieben habe:)

Es gibt Ihnen jede Menge Kontrolle über verschiedene Optionen auf dem Serializer und ermöglicht es Ihnen, außer Kraft zu setzen, wie eine Art durch die Schaffung eines JsonConverter es serialisiert wird.

Meiner Meinung nach JSON ist menschlicher lesbar als XML und Json.NET gibt die Möglichkeit, schön formatierte JSON zu schreiben.

Schließlich wird das Projekt ist Open Source, so dass Sie in den Code Schritt und Änderungen vornehmen, wenn Sie müssen.

Andere Tipps

Wenn ich mich erinnere es funktioniert so etwas wie dies mit einer Eigenschaft:

[XmlArray("Foo")]
[XmlArrayItem("Bar")]
public List<BarClass> FooBars
{ get; set; }

Wenn Sie diesen serialisiert werden Sie so etwas wie bekommen:

<Foo>
    <Bar />
    <Bar />
</Foo>

Natürlich, ich soll wohl die Experten verschieben. Hier weitere Informationen aus MS: http: // msdn. microsoft.com/en-us/library/system.xml.serialization.xmlarrayitemattribute.aspx

Lassen Sie mich wissen, ob das funktioniert für Sie.

Von Ihren Anforderungen klingt es wie XML-Serialisierung am besten ist.

Welche Art von Problemen haben Sie Sammlungen mit, wenn die Serialisierung? Wenn Sie sich beziehen nicht zu wissen, was auf einer Liste oder etwas ähnliches verwenden Attribute, können Sie versuchen, die XmlArray auf Ihrem Grundstück zuzuschreiben. Sie können auf jeden Fall eine Sammlung serialisiert werden.

Die IntermediateSerializer in XNA Framework ist verdammt cool. Sie können eine Reihe von Tutorials zu verwenden es unter http://blogs.msdn.com/shawnhar finden

SOAP-Serialisierung arbeitete gut für mich, auch für Objekte, die nicht markiert mit [Serializable]

werden Sie haben Probleme mit der Sammlung Serialisierung, wenn Objekte in der Sammlung alle Verweise auf andere Objekte in der gleichen Sammlung enthalten. Wenn jede Art von Dual-Zeige vorhanden ist, am Ende Sie eine Multi-Karte erstellen, die nicht serialisiert werden können. An jedem Problem habe ich je eine eigene Sammlung hatte Serialisierung, war es immer, weil einige zusätzliche Funktionen, die ich arbeitete als Teil eines „typischen“ Client-Server-Anwendung fein benötigt, und scheiterte dann kläglich als Teil eines Verbraucher-Anbieter -Server-Anwendung.

Setzen Sie alle Klassen, die Sie in einer separaten Assembly serialisiert werden soll, und verwenden Sie dann die sgen Werkzeug eine Serialisierungsassembly zu erzeugen, um XML zu serialisieren. Verwendung XML-Attribut der Serialisierung zu steuern.

Wenn Sie die Serialisierungsassembly anpassen (und Sie wird müssen das Support-Klassen, die nicht IXmlSerializable und Klassen sind die abstrakten Knoten enthalten), dann sgen anweisen, den Quellcode in eine Dump separate Datei und es dann zu Ihrer Lösung hinzuzufügen. Dann können Sie es bei Bedarf ändern.

http://msdn.microsoft.com/ en-us / library / bk3w6240 (VS.80) aspx

FWIW, ich habe es geschafft, die gesamte AdsML Framework (über 400 Klassen) mit dieser Technik serialisieren. Es hat eine Menge manueller Anpassung erfordern, aber es gibt keinen Weg daran vorbei, dass, wenn Sie die Größe des Rahmens in Betracht ziehen. (Ich habe ein separates Tool von XSD zu C # gehen)

Ich bin damit einverstanden, dass die Datacontract-basierte Serialisierungsmethoden (JSON, XML, etc.) ein wenig komplexer ist als ich möchte.

Wenn Sie versuchen, JSON überprüfen http://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer.aspx

Es ist ein Teil der MS AJAX-Erweiterungen. Zwar wird es als Obsolete in .NET 3.5 markiert aber ScottGu erwähnt in seinem Blog-Kommentar hier ( http://weblogs.asp.net/scottgu/archive/2007/10/01/tip-trick -Gebäude-a-toJSON-extension-Methode-using-net-3-5.aspx # 4301973 ), dass er sich nicht sicher ist, warum, und es sollte ein bisschen länger unterstützt werden.

Die einfachste, was zu tun ist Ihre Objekte mit dem Attribut Serializable markieren und dann ein binäres Formatierungsprogramm verwenden, um die Serialisierung zu handhaben. Die gesamte Klasse Graph sollte kein Problem zur Verfügung gestellt werden, dass alle Objekte enthalten sind, auch als Serializable markiert.

Vielleicht eine effizientere Route der BinaryFormatter zu serialisiert wäre mit

Wie aus http://blog.paranoidferret.com/index.php/2007/04/27/csharp-tutorial-serialize-objects-to-a-file/

using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;

public class Serializer
{
   public Serializer()
   {
   }

   public void SerializeObject(string filename,
                  ObjectToSerialize objectToSerialize)
   {
      Stream stream = File.Open(filename, FileMode.Create);
      BinaryFormatter bFormatter = new BinaryFormatter();
      bFormatter.Serialize(stream, objectToSerialize);
      stream.Close();
   }

   public ObjectToSerialize DeSerializeObject(string filename)
   {
      ObjectToSerialize objectToSerialize;
      Stream stream = File.Open(filename, FileMode.Open);
      BinaryFormatter bFormatter = new BinaryFormatter();
      objectToSerialize =
         (ObjectToSerialize)bFormatter.Deserialize(stream);
      stream.Close();
      return objectToSerialize;
   }
}

Für die Interoperabilität haben wir immer XML-Serialisierung verwendet und sorgte dafür, dass unsere Klasse wurde von Grund auf neu entwickelt um es richtig zu machen.

Wir schaffen ein XSD-Schema-Dokument und eine Reihe von Klassen aus dieser Verwendung XSD.exe erzeugen. Dies erzeugt partielle Klassen, so dass wir dann eine Reihe von entsprechenden Teilklassen erstellen, die zusätzliche Methoden fügen wir uns die Klassen füllen helfen wollen und sie in unserer Anwendung (wie sie auf Serialisierung und deserialising fokussiert werden und sind ein bisschen difficut manchmal zu verwenden ).

Sie sollten die NetDataContractSerializer verwenden. Der Begriff umfasst jede Art von Objektgraphen und unterstützt Generika, Listen, Polymorphismus (das Knowntype Attribut ist hier nicht erforderlich), Rekursion und etc. Der einzige Nachteil ist, dass Sie alles, was Sie Klassen mit [Serializable] / [Datacontract] Attribute markieren, aber die Erfahrung zeigt, dass Sie irgendeine Art von manuellen Feinabstimmung ohnehin tun müssen, da nicht alle Mitglieder beibehalten werden soll. Auch serialisiert es in eine XML, obwohl seine Lesbarkeit fragwürdig ist.

Wir hatten die gleichen Anforderungen wie bei Ihnen und diese Lösung gewählt haben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top