51

JSON で表された JavaScript オブジェクトを適切な C# クラスに逆シリアル化する必要があります。自動プロパティの優れた機能を考えると、フィールドだけではなく、これらのクラスにそれらを含めることをお勧めします。残念ながら、.NET シリアライゼーション エンジン (少なくともデフォルトでは) は、デシリアライゼーションの自動プロパティを完全に無視し、JavaScript オブジェクトには明らかに存在しないバッキング フィールドのみを考慮します。

バッキング フィールドに名前を付ける標準的な方法がないことを考えると、正直に言うと、「C# バッキング フィールドがあるように見える JavaScript オブジェクトを作成しましょう」というアプローチを気にしたくありません。シリアライゼーション エンジンにバッキング フィールドを何らかの形で無視させ、プロパティを直接使用させることができれば、JavaScript フィールドを C# 自動プロパティにシリアライズできます。残念ながら、これがどのように行われるのか、またはこれがまったく可能かどうかはわかりません。どんなアイデアでも大歓迎です。

編集:ここに例があります:

Javascript:

function Cat()
{
    this.Name = "Whiskers";
    this.Breed = "Tabby";
}
var cat = new Cat();

これは、「{Name: 'Whiskers'}」にシリアル化されます。

C# クラス:

[Serializable()]
public class Cat
{
    public string Name { get; set; }
    public string Breed { get; set; }
}

そして、失敗する逆シリアル化コード:

new DataContractJsonSerializer(typeof(Cat)).ReadObject(inputStream);

また、バッキング フィールドを探しているために失敗したことは、例外から明らかです。

EDIT2 :これが役立つ場合は例外です(内部例外はありません):

System.Runtime.Serialization.SerializationException

<Name>k__BackingField, <Breed>k__BackingField「必要なデータ メンバー ' ' が見つからなかったため、データ コントラクト タイプ 'Test.Cat' を逆シリアル化できません。」

4

4 に答える 4

5

baretta の回答により、 k__BackingField の肥大化が解決されました。このクラスをデコレートして、同様の方法で XML または JSON に自動シリアル化できるという小さな補遺があります。

[Serializable, XmlRoot, DataContract]
public class Cat
{
  [XmlElement]
  [DataMember]
  public string Name { get; set; }
  [XmlElement]
  [DataMember]
  public string Breed { get; set; }
}

...そして、DataContractJsonSerializer または XmlSerializer を使用して、エンドポイント用に準備します。

于 2010-01-29T12:56:16.337 に答える