我正在编写我的第一个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或将任何静态未知的类型添加到已知类型列表
答案 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);
}