2013-04-18 57 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

对于取消接受感到抱歉,我已根据您的推荐更改名称,并添加了奖励。 –

相关问题