2

サービスのルート レベルに DataContract と DataMember を持つコントラクトに Serializable クラスを含む WCF サービスがあります。

問題を切り分けるためのソリューションを構築しようとしているときに、次のことに遭遇しました。

[ServiceContract]
public interface IService1
{
    [OperationContract]
    CompositeType GetDataUsingDataContract();

}


[DataContract]
public class CompositeType
{
    [DataMember]
    public MyType MyProperty { get; set; }

}

[Serializable]
public class MyType
{
    private int amount1;

    [XmlElement(Form = XmlSchemaForm.Unqualified, DataType = "int", ElementName = "AmountN")]
    public int Amount1
    {
        get
        { return amount1; }
        set
        { amount1 = value; }
    }

 }

次の xsd を提供します。

<xs:complexType name="CompositeType">
 <xs:sequence>
  <xs:element name="MyProperty" type="tns:MyType" nillable="true" minOccurs="0"/>
 </xs:sequence>
</xs:complexType><xs:element name="CompositeType" type="tns:CompositeType" nillable="true"/>
<xs:complexType name="MyType">
  <xs:sequence>
   <xs:element name="amount1" type="xs:int"/>
  </xs:sequence>
 </xs:complexType>
 <xs:element name="MyType" type="tns:MyType" nillable="true"/>
</xs:schema>

質問:なぜプライベートはシリアル化されているのに、パブリック メンバーはシリアル化されていないのですか?

4

2 に答える 2

1

シリアライザーとシリアライゼーション属性は 2 つの異なるものです。

XmlElementは for の属性ですが、 forまたは for にXmlSerializerは意味がありません。XmlElementAttribute クラスDataContractSerializerBinaryFormatter

DataContractSerializer複数の型をシリアル化できますが、独自のシリアル化アルゴリズムLinkを使用します。でマークされたオブジェクトをシリアル化する場合、既定のシリアル化パターン[Serializable]に 従います (すべてのメンバーのシリアル化が適用されます)。さらに制御が必要な場合は、カスタムのシリアル化を実装してから、シリアル化されたオブジェクトSerializationでノード名と値を設定できます。DataContractSerializer[NonSerialized]ISerializable

IXmlSerializableシリアル化されたオブジェクトがどのように見えるかを実装して完全に制御するオプションもあります。

于 2013-04-23T21:43:13.620 に答える
1

この msdn 記事では、wcf が MyType をシリアル化できる理由を説明できます。

データ コントラクト シリアライザーでサポートされる型: . . .

SerializableAttribute 属性でマークされた型。.NET Framework 基本クラス ライブラリに含まれる多くの型は、このカテゴリに分類されます。DataContractSerializer は、ISerializable インターフェイスのサポートを含め、.NET Framework リモート処理、BinaryFormatter、および SoapFormatter で使用されたこのシリアル化プログラミング モデルを完全にサポートします。

また、wcf はプライベート フィールドをシリアル化することに問題がないため、おそらくこれが privet フィールドをシリアル化する理由ですamount1

INO、質問は「なぜあなたのプロパティAmount1がシリアル化されなかったのですか?」名前を変更し(フィールド名とは異なる)、xml属性を削除して、再試行します。

于 2013-04-18T14:22:27.320 に答える