2011-07-27 11 views
2

愚かな質問:ビューステートに格納するオブジェクトがあるとしましょう。私はそれをSerializableとしてマークしました。私はまた、WCFサービスで同じオブジェクトを再利用します。しかし、Webサービスは、サービスクライアントに表示する必要はなく、安全ではない内部プロパティをシリアル化して公開します。 WebサービスではなくViewStateのフィールド/プロパティのシリアル化を許可する方法はありますか? [非シリアル化]は両方からプロパティを非表示にします。 私はWebサービス用のPOCOを実装することができますが、メソッド名やオブジェクトの署名はクラス名まで変更しないようにしたいと考えていました。 方法があるかどうか不思議です。もしそうでなければ、私はViewStateのフィールドを使わずに生きるか、POCOを作成して顧客がクライアントの再実装を心配するようにしなければならないでしょう。オブジェクトのシリアル化:個々のプロパティの選択

おかげ

答えて

3

WebサービスのためのDataContractを作成するときにはい、あなたは[DataMember]属性とサービス要求と応答に含まれるようにしたいメンバーをマーク。

[DataContract] 
[Serializable] 
public class MyData 
{ 
    private int id_value; 

    // Apply the DataMemberAttribute to the property. 
    [DataMember] 
    public int ID 
    { 

     get { return id_value; } 
     set { id_value = value; } 
    } 

    public int DontExposeMeToWcf { get; set; } 
} 

編集:.NET 4.0であなたもシリアライズからメンバーを除外する[IgnoreDataMember]属性を使用することができます。 Using Data Contractsから:

デフォルトでは、DataContractSerializer は、データコントラクトを推測し、すべて公開さの種類をシリアル化します。 タイプのすべてのパブリック読み取り/書き込みプロパティとフィールドは、 がシリアル化されています。 IgnoreDataMemberAttributeを使用して、シリアライゼーションからメンバーをオプトアウトすることができます。

IgnoreDataMemberAttribute属性は、 のマークが付いていないタイプでのみ使用されます。これには、 DataContractAttribute、SerializableAttribute、 CollectionDataContractAttribute、またはEnumMemberAttribute属性のいずれかでマークされていない型、または他の手段(IXmlSerializableなど)によって直列化可能とマークされた が含まれます。

+0

私が知る限り、WCFを使用してシリアル化するには、.NET 4のDataContract/DataMemberでオブジェクト/プロパティを修飾する必要はありません。私は非表示しようとしているこれらのプロパティがDataMembersとしてマークされておらず、まだシリアル化されていることを確認しています。 – Dimitri

+0

@Dimitriそれらを含めることはなおもベストプラクティスです。 –

+0

さて、私のシナリオは次のとおりです。DataContractとしてマークされ、DataMemberとしてマークされたプロパティを持つMyClassクラスがあります。このクラスの一部のプロパティはDataMemberとしてマークされておらず、シリアル化されていません。しかし、このクラスは、Serializableとマークされた別のクラスMyBaseClassを継承しますが、DataContractでは継承しません。この基本クラスのプロパティは、シリアル化で表示されます。したがって、DataContractとして基本クラスをデコレートし、そのプロパティをDataMembersとしてデコレートしないと、Webサービスにシリアライズしないでください。 – Dimitri

関連する問題