【发布时间】:2018-05-03 09:00:00
【问题描述】:
我有一个 WCF 服务,它公开了一个类型 TestTypeOne,该类型当前有一个名为 ProductId 的字符串属性:
public class TestTypeOne
{
[DataMember(Name = "ProductId")]
public string ProductId { get; set; } //note it's a string at the moment
}
我想将此属性的类型从 string 更改为名为 ProductId 的自定义值类型,但不会破坏 WCF 合同(这仅适用于服务器端,客户端应将 ProductId 视为仍然是一个字符串。)
public class TestTypeOne
{
[DataMember(Name = "ProductId")]
public ProductId ProductId { get; set; }
}
自定义类型是这样的(为简洁起见,大部分代码被删除):
public struct ProductId : IEquatable<ProductId>
{
readonly string productId;
public ProductId(string productId)
{
this.productId = productId
}
public override string ToString() => productId ?? string.Empty;
}
使用以下测试代码:
var sb = new StringBuilder();
using (var writer = new XmlTextWriter(new StringWriter(sb)))
{
var dto = new TestTypeOne {
ProductId = new ProductId("1234567890123")
};
var serializer = new DataContractSerializer(typeof(TestTypeOne));
serializer.WriteObject(writer, dto);
writer.Flush();
}
Console.WriteLine(sb.ToString());
序列化时的预期输出应该是:
<Scratch.TestTypeOne xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/Tests">
<ProductId>1234567890123</ProductId>
</Scratch.TestTypeOne>
我尝试过实现ISerializable,但这似乎只能让我控制ProductId xml 标签的内容,而不是标签本身(所以我可以让<ProductId><something>1234113</something></ProductId> 之类的事情发生)。
理想情况下,我可以对 ProductId 类型本身做一些事情,因为这种类型在许多地方和许多合同中都有使用。
【问题讨论】:
-
你也需要反序列化这个类型吗?
-
@Evk 是的,但仍然只在服务器端(因此客户端应该以字符串属性结束,只有服务器在与 ProductId 进行转换)
标签: c# wcf datacontractserializer