我的DataContract有什么问题?

时间:2011-07-19 22:56:14

标签: wcf datacontractserializer datacontract

我正在编写我的第一个WCF服务。我想了解Datacontracts的工作原理。我已阅读MSDN Article,其中描述了如何标记自定义类型以创建数据合同,但我无法让我的示例工作。

我有一个简单的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:输入数据合约名称为“MockCheckInDTO:http://schemas.datacontract.org/2004/07/org.healthwise.gatewayinterfaces”的'org.healthwise.gatewayinterfaces.mocks.MockCheckInDTO'。嘲笑不是预期的。考虑使用DataContractResolver或将任何静态未知的类型添加到已知类型列表

2 个答案:

答案 0 :(得分:0)

尝试从私有字段中删除[DataMember],因此它只是在公共属性上。如果您仍然遇到问题,那么教您自己使用DataContract进行的操作可能会有好处,而不是在共享库中使用DC,而是从服务元数据中自动创建它。然后看看它,看看它是否符合你的期望。如果没有,当你尝试序列化/反序列化对象时,你至少会知道出了什么问题。

答案 1 :(得分:0)

首先,我们需要对两次相同的数据进行序列化:私有字段和公共属性。正如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);
            }