2013-04-18 56 views
2

我們有一個WCF服務,它在包含服務根級DataContract和DataMember的合同中包含Serializable類。爲什麼公共財產沒有被序列化?

在試圖建立一個解決方案,以找出問題,我碰上了以下內容:

[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> 

問題是:爲什麼是民營,但不是公衆成員正在序列化?

回答

1

串行器和序列化屬性是兩個不同的東西。

XmlElement屬於XmlSerializer屬性,但它對DataContractSerializerBinaryFormatter沒有任何意義。 XmlElementAttribute Class

DataContractSerializer可以序列化多種類型,但它使用自己的序列化算法Link。在序列化標記爲[Serializable]的對象時, DataContractSerializer遵循默認序列化模式(序列化所有成員,適用於[NonSerialized])。如果您需要更多控制,那麼您可以實現ISerializable以進行自定義序列化,然後您可以在序列化對象Serialization中設置節點名稱和值。

還有一個選項來實現IXmlSerializable並完全控制序列化對象的樣子。

1

This msdn article可以解釋,爲什麼WCF能夠系列化你的MyType:

類型數據協定序列化支持: 。 。

標記有Seri​​alizableAttribute屬性的類型。包含在.NET Framework基類庫中的許多類型 屬於此類 類別。 DataContractSerializer完全支持.NET Framework遠程處理, BinaryFormatter和SoapFormatter使用的編程模型,其中包括對ISerializable接口的支持。

而且因爲WCF沒有問題序列化的私人領域,很可能這是你的序列化女貞場amount1的原因。

INO,問題是「爲什麼你的財產Amount1未被序列化?」「我試圖重命名它(與字段名稱不同),刪除它的xml屬性,並重新嘗試。

+0

對於取消接受感到抱歉,我已根據您的推薦更改名稱,並添加了獎勵。 –

相關問題