2012-03-15 13 views
0

WCFには新しく、シリアル化が正しく機能しない理由を理解するのに役立つ必要があります。wcf serialization

サービスの定義 - 私は、ポストLogDeviceCommunicationオブジェクトにシリアライズして、ちょうど私がちょうどテストとしてフィドラーでは、次のXMLを掲示しています現時点では、簡単なテスト

[OperationContract] 
[WebInvoke(UriTemplate = "AddDeviceCommunicationLog", RequestFormat = 
WebMessageFormat.Xml, BodyStyle = WebMessageBodyStyle.Bare, Method = "POST")] 
LogDeviceCommunication AddDeviceCommunicationLog(LogDeviceCommunication 
deviceCommunicationEntry); 

public LogDeviceCommunication AddDeviceCommunicationLog(LogDeviceCommunication 
deviceCommunicationEntry) 
    { 
    return deviceCommunicationEntry; 
    } 

としてオブジェクトを返すようにしたいです。

<?xml version="1.0" encoding="UTF-8"?> 
<LogDeviceCommunication> 
    <ID>1207a26e-ab59-4977-b7eb-b2776205cffe</ID> 
    <DeviceID>A42E8707-7C65-45AA-8E58-5D21F53DA101</DeviceID> 
    <Time>2012-03-14T15:38:28.379Z</Time> 
    <Line>0</Line> 
    <Tab>0</Tab> 
    <Info>Starting Synchronisation</Info> 
</LogDeviceCommunication> 

結果は

<LogDeviceCommunication z:Id="i1" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/"> 
    <ChangeTracker z:Id="i2" 
     xmlns:a="http://schemas.datacontract.org/2004/07/conxEntities"> 
     <a:ExtendedProperties/> 
     <a:ObjectsAddedToCollectionProperties/> 
     <a:ObjectsRemovedFromCollectionProperties/> 
     <a:OriginalValues/> 
     <a:State>Added</a:State> 
    </ChangeTracker> 
    <DeviceID>00000000-0000-0000-0000-000000000000</DeviceID> 
    <ID>1207a26e-ab59-4977-b7eb-b2776205cffe</ID> 
    <Info i:nil="true"/> 
    <Line i:nil="true"/> 
    <Tab i:nil="true"/> 
    <Time>2012-03-14T15:38:28.379Z</Time> 
</LogDeviceCommunication> 

はなぜデバイスIDは、IDが正しいGUIDが含まれていながら、(私はそれがnullのGUIDだと仮定)0000年代を含まないフィドラー

から返されました。 Info、Line、Info要素にnil値が含まれているのはなぜですか? LogDeviceCommunicationはPOCOは、ADO.NETセルフトラッキングテンプレート

要約版を、私は私が間違っので、任意のヘルプは感謝何かをやっていると確信して

[DataContract(IsReference = true, Namespace = "")] 

public partial class LogDeviceCommunication: IObjectWithChangeTracker, 
INotifyPropertyChanged 
[DataMember] 
public System.Guid DeviceID 
[DataMember] 
public System.DateTime Time 
[DataMember] 
public Nullable<int> Line 
[DataMember] 
public Nullable<int> Tab 
[DataMember] 
public string Info 
[DataMember] 
public System.Guid ID 

される使用EF4から生成されています。

+1

私はあなたには、いくつかの関連するコードを残してきたと思います。 ChangeTrackerはどのように初期化されていますか? (あなたはEFの人たちからいくつかの注意を喚起するためにEF4にあなたの質問にタグを付けることもできます。 –

答えて

0

WCFが要求を受け取ると、そのデシリアライゼーション機構によって、LogDeviceCommunicationタイプの新しいインスタンスが作成され、受け取った値が入力されます。あなたのインスタンスのEF部分クラスからのコードがトリガーされているようで、あなたの質問に投稿するものになります。

AddDeviceCommunicationLogメソッドのreturn文でデバッガブレークポイントを設定して、EF & WCFがどのようなものを逆シリアル化したのかを確認してください。あなたが投稿したものと同じであれば、その問題はEF配管コードが原因である可能性があります。また、WCF message tracingを有効にして、実際にWCFが受信して戻ってきたものを確認することもできます。

EDIT:EF & WCFの間のやり取りの一部を示すthis blog postを横切ってちょうど走った。あなたはそれを見直してあなたの問題に該当するかどうかを知ることができます。

0

あなたが見ている要素が、そのテンプレートによって生成されたクラスの他の部分に含まれると思います。

一般に、EFエンティティ(または複雑な.NETタイプ)をWebサービスから返すのは良い考えではありません。実装依存関係に沿ってドラッグします。代わりに純粋にPOCOクラスをDTOとして返します。

関連する問題