Wcf 我的数据合同有什么问题?

Wcf 我的数据合同有什么问题?,wcf,datacontractserializer,datacontract,Wcf,Datacontractserializer,Datacontract,我正在写我的第一个WCF服务。我试图理解数据契约是如何工作的。我已经阅读了描述如何标记自定义类型以创建数据协定的示例,但我无法让我的示例正常工作 我有一个简单的DTO对象,我把它放在一个共享库中,因为我想让客户机和服务了解这种类型(对吗?),它看起来像这样: using System.Collections.Generic; using System.Runtime.Serialization; namespace org.healthwise.gatewayinterfaces.mock

我正在写我的第一个WCF服务。我试图理解数据契约是如何工作的。我已经阅读了描述如何标记自定义类型以创建数据协定的示例,但我无法让我的示例正常工作

我有一个简单的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; }
        }
    }
}
我创建了一个小控制台应用程序,试图将这个MockCheckInDTO发送到我的服务中,但它从未到达那里。似乎我正在对MockCheckInDTO对象进行序列化。有人能帮我吗

这是我看到的一个例外:

System.Runtime.Serialization.SerializationException:键入“org.healthwise.gatewayinterfaces.mocks.mockCheckInTo”,数据协定名称为“mockCheckInTo”:http://schemas.datacontract.org/2004/07/org.healthwise.gatewayinterfaces.mocks”他说。考虑使用DATACONTRORTCORDEVER或在已知类型

列表中添加静态不知道的任何类型。
尝试从私有字段中删除
[DataMember]
,这样它就只在公共属性中。如果您仍然有问题,这可能有助于您了解DataContract的进展情况,而不是让DC位于共享库中,而是让它从服务元数据自动创建。然后看看它,看看它是否是你所期望的。如果没有,那么在尝试序列化/反序列化对象时,您至少可以了解出了什么问题。

首先,您可以将相同的数据序列化两次:私有字段和公共属性。正如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);
            }

请您添加一些代码,说明如何调用
AddToIndex
?这是我的第一个WCF项目。我不知道这个svcutil.exe似乎是客户机“发现”数据契约的公认方法。

            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);
            }