31

クラス グラフ全体を気にすることなく、オブジェクトをシリアライズおよびデシリアライズしたいと考えています。

柔軟性が重要です。オブジェクト グラフ全体で完全な属性を必要とせずに、渡されたオブジェクトをシリアル化できるようにしたいと考えています。

つまり、バイナリ シリアル化は、他の .NET プラットフォームでのみ機能するため、オプションではありません。また、人が読めて、管理プログラムや他の通訳者が解読できるものを希望します。

DataContract、JSON、および XML シリアライザーの使用に関する問題を発見しました。

  • これらのエラーのほとんどは、リスト/辞書のシリアル化 (つまり、XML Serializable Generic Dictionary ) に集中しているようです。
  • 「たとえば、KnownTypeAttribute 属性を使用するか、DataContractSerializer に渡される既知の型のリストにそれらを追加することにより、静的に認識されていない型を既知の型のリストに追加します。」

理論や記事の読みではなく、実際の経験に基づいて回答してください。

4

12 に答える 12

54

XML ではなく JSON へのシリアル化を検討したことはありますか?

Json.NETには、Hashtables/汎用辞書に問題がなく、特定の属性を必要としない、非常に強力で柔軟なシリアライザーがあります。私はそれを書いたので知っています:)

シリアライザーのさまざまなオプションを介してさまざまな制御を提供し、JsonConverter を作成して型をシリアル化する方法をオーバーライドできます。

私の意見では、JSON は XML よりも人間が読める形式であり、Json.NET は適切にフォーマットされた JSON を記述するオプションを提供します。

最後に、プロジェクトはオープン ソースであるため、必要に応じてコードにステップ インして変更を加えることができます。

于 2008-09-20T02:32:51.267 に答える
3

私が思い出すと、プロパティで次のように機能します。

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

これをシリアル化すると、次のようになります。

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

もちろん、私はおそらく専門家に任せるべきです。MS からの詳細情報: http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlarrayitemattribute.aspx

それがうまくいくかどうか教えてください。

于 2008-09-20T01:23:08.313 に答える
2

あなたの要件から、Xml Serialization が最適であるように思えます。

コレクションをシリアライズするとき、どのような問題がありますか? リストなどで使用する属性がわからない場合は、プロパティで XmlArray 属性を試してみてください。コレクションを確実にシリアル化できます。

于 2008-09-20T01:02:19.517 に答える
1

DataContractベースのシリアル化メソッド(JSON、XMLなど)が私が望むよりも少し複雑であることに同意します。

JSONを取得しようとしている場合は、http://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer.aspxを確認してください。

これはMSAJAX拡張機能の一部です。確かに、.NET 3.5では廃止のフラグが立てられていますが、ScottGuはブログコメントでここに言及しています(http://weblogs.asp.net/scottgu/archive/2007/10/01/tip-trick-building-a-tojson-extension -method-using-net-3-5.aspx#4301973)理由がわからないため、もう少し長くサポートする必要があります。

于 2008-09-20T10:07:05.637 に答える
1

コレクション内のオブジェクトに同じコレクション内の他のオブジェクトへの参照が含まれている場合、コレクションのシリアル化で問題が発生します。いずれかのタイプのデュアル ポインティングが存在する場合、シリアル化できないマルチマップを作成することになります。私がこれまでにカスタムコレクションをシリアル化する際に発生したすべての問題は、「典型的な」クライアントサーバーアプリケーションの一部として正常に機能し、コンシューマープロバイダーの一部として惨めに失敗した、必要な追加機能が常にあったためです。 -サーバー アプリケーション。

于 2008-09-20T01:22:07.893 に答える
1

XNA Framework の IntermediateSerializer は非常に優れています。http://blogs.msdn.com/shawnharで、使用に関するチュートリアルを多数見つけることができます。

于 2008-09-20T00:47:59.410 に答える
1

[Serializable] でマークされていないオブジェクトでも、SOAP シリアライゼーションはうまく機能しました。

于 2008-09-20T00:51:08.997 に答える
1

シリアル化するすべてのクラスを個別のアセンブリに入れ、sgen ツールを使用してシリアル化アセンブリを生成し、XML にシリアル化します。XML 属性を使用してシリアル化を制御します。

シリアル化アセンブリをカスタマイズする必要がある場合 (およびIXmlSerializable ではないクラスと抽象ノードを含むクラスをサポートするために必要になる場合)、ソース コードを別のファイルにダンプしてからソリューションに追加するように sgen に指示しますその後、必要に応じて変更できます。

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

FWIW、この手法を使用して、AdsML フレームワーク全体 (400 以上のクラス) をシリアル化することができました。多くの手作業によるカスタマイズが必要でしたが、フレームワークのサイズを考慮すると、それを回避することはできません。(別のツールを使用して XSD から C# に移行しました)

于 2008-09-20T01:35:08.533 に答える
0

NetDataContractSerializerを使用する必要があります。あらゆる種類のオブジェクトグラフをカバーし、ジェネリック、リスト、ポリモーフィズム(KnownType属性はここでは必要ありません)、再帰などをサポートします。唯一の欠点は、すべてのクラスを[Serializable]/[DataContract]属性でマークする必要があることです。しかし、経験によれば、すべてのメンバーを永続化する必要はないため、とにかく何らかの手動の微調整を行う必要があります。また、読みやすさには疑問がありますが、Xmlにシリアル化されます。

私たちはあなたと同じ要件を持っていて、このソリューションを選びました。

于 2008-09-20T09:56:36.673 に答える
0

おそらく、BinaryFormatter を使用してシリアル化するのがより効率的な方法でしょう。

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;
   }
}
于 2008-09-20T02:14:54.880 に答える
0

最も簡単な方法は、オブジェクトに Serializable 属性を付けてから、バイナリ フォーマッタを使用してシリアル化を処理することです。含まれているオブジェクトもシリアライズ可能としてマークされていれば、クラス グラフ全体が問題になることはありません。

于 2008-09-20T00:47:51.127 に答える
0

相互運用性のために、私たちは常に Xml シリアライゼーションを使用し、クラスがそれを正しく行うようにゼロから設計されていることを確認しました。

XSD スキーマ ドキュメントを作成し、XSD.exe を使用して一連のクラスを生成します。これにより部分クラスが生成されるため、対応する部分クラスのセットを作成して、クラスにデータを入力し、アプリケーションで使用するのに役立つ追加のメソッドを追加します (これらはシリアライズとデシリアライズに焦点を当てており、使用するのが少し難しい場合があるため) )。

于 2008-09-20T02:44:42.890 に答える