1

XML で次のクラスをシリアル化するために、データ コントラクトのシリアル化を使用しています。

[DataContract]
public partial class Foo
{
    [DataMember]
    public string MyString { get; set; }
    [DataMember]
    public int MyInt { get; set; }
    [DataMember]
    public Bar MyBar { get; set; }
}

[DataContract]
public class Bar
{
    public int BarId { get; set; }
    [DataMember]
    public string BarField { get; set; }
}

シリアル化すると、次のような XML が生成されます。

<Foo>
    <MyString>My text</MyString>
    <MyInt>2</MyInt>
    <MyBar>
        <BarField>My bar field</BarField>
    </MyBar>
</Foo>

私がやりたいことは、MyBarフィールドが複合型として表示されないようにすることですが、代わりに次のようにします。

<Foo>
    <MyString>My text</MyString>
    <MyInt>2</MyInt>
    <MyBar>My bar field</MyBar>
</Foo>

データ コントラクトのシリアル化は初めてで、問題に対処するチュートリアルが見つかりません。それが可能かどうかさえわかりませんが、あきらめてそのまま対処するか、より良い解決策を見つける前に、質問することにしました。

4

2 に答える 2

3

データ クラスを として装飾することによりDataContract、シリアル化されたときにデータが表現される構造 (Xml、Json など) を本質的に設定します。

データクラスから「ビジネスエンティティ」と「シリアル化エンティティ」の問題を分割することを提案できますか?たとえば、Foo+Barがメモリ内またはデータの ORM 表現である場合は、[DataContract]それらから s を削除します。

public partial class Foo
{
    public string MyString { get; set; }
    public int MyInt { get; set; }
    public Bar MyBar { get; set; }
}

public class Bar
{
    public string BarField { get; set; }
}

次に、シリアル化された形式専用の新しいクラスを提供します。DataContract

[DataContract]
public partial class SerializableFoo
{
    [DataMember]
    public string MyString { get; set; }
    [DataMember]
    public int MyInt { get; set; }
    [DataMember]
    public string MyBar { get; set; }
}

次に、一方から他方にマップするマッピング関数を提供します。この種の作業には LINQ が最適です。クラスのプロパティ名がほとんど同じであれば、AutoMapper が多くの作業を代行してくれます。

例えば

var wireFoo = new SerializableFoo()
{
    MyString = foo.MyString,
    MyInt = foo.MyInt,
    MyBar = foo.Bar.BarField // Do the projection / flattening here
}
// Serialize wireFoo here, or return it from a WCF Service, etc.
于 2012-11-13T15:55:45.497 に答える
2

あなたはそれを複合型として定義しています...つまり、それはそのまま通過します。それを望まない場合は、Foo のデータ コントラクトを変更して、Bar を複雑な型ではなく文字列として持つようにします。

基本的に、XML 用語では、クラスを DataContract として定義し、プロパティを DataMembers として定義し、複雑なオブジェクト、または要素を含む要素を作成しています。あなたが提示したケースでは、最初のデータ コントラクトを変更して、複雑なオブジェクトを追加せず、必要なデータのみを含めるようにします。

ただし、これらの SOA 状況で OO 設計を適用する場合、何を達成しようとしているのかによっては、他の複雑なオブジェクト内の複雑なオブジェクトは、プロパティでいっぱいの巨大な複雑なオブジェクトよりも扱いやすく、さらには読みやすくなる可能性があります。

結果を取得するには、Bar クラスをドロップし、Foo に文字列を返すだけです。

[DataContract]
public partial class Foo
{
    [DataMember]
    public string MyString { get; set; }
    [DataMember]
    public int MyInt { get; set; }
    [DataMember]
    public string MyBar { get; set; }
}

編集:私は答えが十分に明確ではなかったと思います。これは、必要なものを取得して複雑な型を保持できないということです。XML は、OO 設計に基づいて構造化されます。

于 2012-11-13T15:45:41.160 に答える