2011-07-19 4 views
0

私は最初のWCFサービスを書いています。私はDatacontractsの仕組みを理解しようとしています。私はMSDN Articleを読んでいます。これは、データコントラクトを作成するためにカスタムタイプをマークアップする方法を説明していますが、私の例がうまくいかないことがあります。DataContractで何が問題になっていますか?

私はクライアントとサービスが知りたいので、私はこのタイプ(右?)それはこのようになりますについて私は共有ライブラリに配置したシンプルなDTOオブジェクトを持っている:これは

using System.Collections.Generic; 
using System.Runtime.Serialization; 

namespace org.healthwise.gatewayinterfaces.mocks 
{ 
    [DataContract] 
    public class MockCheckInDTO : ICheckInDTO 
    { 
     [DataMember] 
     private string _testPackageFilePath = "testpackages\\973eb455-6acc-486b-a1dd-2cf527872b1e.zip"; 
     [DataMember] 
     private IDictionary<string, string> _testMetaData; 

     public MockCheckInDTO() 
     { 
      _testMetaData = MakeTestMetaDataDictionary(); 
     } 

     private IDictionary<string, string> MakeTestMetaDataDictionary() 
     { 
      IDictionary<string, string> testMetaData = new Dictionary<string, string>(); 
      testMetaData.Add("Version", "9.0.1"); 
      testMetaData.Add("Product Family", "Learning Modules"); 
      return testMetaData; 
     } 

     [DataMember] 
     public string PackageFileLocation 
     { 
      get { return _testPackageFilePath; } 
      set { _testPackageFilePath = value; } 
     } 

     [DataMember] 
     public IDictionary<string, string> PackageMetaData 
     { 
      get { return _testMetaData; } 
      set { _testMetaData = value; } 
     } 
    } 
} 

ServiceContract:

[ServiceContract] 
    public interface IIndexCheckIn 
    { 
     [OperationContract] 
     void AddToIndex(MockCheckInDTO mockCheckInDto); 
    } 

私は私のサービスにこのMockCheckInDTOを介して送信しようとする小さなコンソールアプリケーションを作成しているが、それはそこに着くことはありません。私はMockCheckInDTOオブジェクトのシリアライズをしているようです。誰かが私を助けることができますか?

これは私が見ていた例外です:

System.Runtime.Serialization.SerializationException:タイプ 'org.healthwise.gatewayinterfaces.mocks.MockCheckInDTO' データコントラクト名「MockCheckInDTOとします。http://スキーマ.datacontract.org/2004/07/org.healthwise.gatewayinterfaces.mocks 'は期待されていません。 DataContractResolverの使用を検討したり、それは公共の性質上だけですので、プライベートフィールドから[DataMember]を削除してください既知のタイプ

+0

「AddToIndex」をどのように呼び出しているかのコードを追加できますか? –

答えて

0

のリストに静的に知られていない任意のタイプを追加。それでも問題が解決しない場合は、共有ライブラリにDCを置くのではなく、サービスメタデータからDCを自動的に作成するために、DataContractで何が起こっているのかを自分で教えるのが良いかもしれません。それからそれを見て、あなたが期待しているものかどうかを見てください。もしそうでなければ、少なくともオブジェクトをシリアライズ/デシリアライズしようとすると何がうまくいかないのか分かります。

+0

これは私の最初のWCFプロジェクトです。私は、このsvcutil.exeが、クライアントがdatacontractsを "発見"するために受け入れられる方法であるとは思わなかった。 – Nick

0

最初に、同じデータを2回、プライベートフィールドとパブリックプロパティの2つにシリアル化することが賢明です。 Tim S.が言ったように、それを削除するほうが良いです。 DataContractSerializerを直接使用して問題を再現しようとしましたが、失敗しました。


      DataContractSerializer serializer = new DataContractSerializer(typeof(MockCheckInDTO)); 

      var data = new MockCheckInDTO(); 

      using (var file = File.OpenWrite("dto.xml")) 
      using (var xmlWriter = XmlDictionaryWriter.CreateTextWriter(file)) 
      { 

       serializer.WriteObject(xmlWriter, data); 
      } 

      using (var file = File.OpenRead("dto.xml")) 
      using (var xmlReader = XmlDictionaryReader.CreateTextReader(file, XmlDictionaryReaderQuotas.Max)) 
      { 

       var result = serializer.ReadObject(xmlReader); 
      } 
関連する問題