0

次のようなコマンド ラインでデータ コントラクトを生成しています。

svcutil /ct:System.Collections.Generic.List`1 MySchema.xsd

生成されたコードでは、次のような結果になります (これを「スタイル 1」と呼びましょう)。

partial class A : object, System.Runtime.Serialization.IExtensibleDataObject
{
    private BType collectionB;

    public BType CollectionOfB
    {
        get { return collectionB; }
        set { collectionB = value }
    }

    [System.Runtime.Serialization.CollectionDataContractAttribute(...)]
    public class BType : System.Collections.Generic.List<B>
    {
    }
}

このように生成されないのはなぜですか (スタイル 2)?:

partial class A : object, System.Runtime.Serialization.IExtensibleDataObject
{
    private System.Collections.Generic.List<B> collectionB;

    public System.Collections.Generic.List<B> CollectionOfB
    {
        get { return collectionB; }
        set { collectionB = value }
    }
}

コードを使用するという観点からは、両方の最終結果は同じように見えます。スタイル 1 がシリアル化を有効にする唯一の理由はありますか (CollectionDataContractAttribute のドキュメントは、クラスまたは構造体に適用されることを示しています)? それらは内部クラスであり、これは 100% 生成されたコードであるため、実装の詳細は無視できますが、少し気になります (さらに、クラス図に「ネストされた型」が表示されます)。

さて、プロパティに属性を適用してシリアル化する方法を伝えることができないのは非常に気になります。

4

1 に答える 1

0

私が知る限り、この問題は svcutil のアーティファクトです。http://msdn.microsoft.com/en-us/library/aa347850.aspxから判断すると、シリアライゼーションを手作業でコード化する意思がある場合、実際にスタイル 1 を使用して不要な内部型を回避できるようです。

コンシューマのインターフェイスは同じなので、クリーンなオブジェクト モデルを使用するよりも簡単に更新できるようにします。

于 2012-06-08T15:37:47.870 に答える