【问题标题】:Can you get conditional control over serialization with DataContractSerializer?您可以使用 DataContractSerializer 对序列化进行条件控制吗?
【发布时间】:2010-10-17 20:41:57
【问题描述】:
我正在转换我的一些类以使用 DataContractSerialization,以便我可以在输出中包含 Linq 实体。在这个过程中,一个理论问题突然出现在我的脑海中,当我打赌答案是“不”时,我想我还是会提出这个问题。
有没有办法有条件地序列化一个对象?例如,如果我为了向客户发送信息而序列化一个 Employee 对象,我可能不想包含地址。另一方面,如果我将其序列化以在管理该员工的网站的 Web 服务中使用,我可能需要该信息。
另一种可能性是根据某些成员是否是被序列化的基础对象来序列化它们。因此,如果我有一个包含 Location 的 Ticket 类,并且 Location 包含一个联系人列表,如果我正在序列化 Ticket,我可能不想要那个联系人列表。但是,如果我尝试使用 Location 本身,它可能会很好。
那么你有什么想法吗?
【问题讨论】:
标签:
.net
serialization
datacontractserializer
【解决方案1】:
我还没有使用过 WCF,但我知道使用 .Net 中的标准序列化(基于属性),我可以在一个类上有一个 OnSerializing 和一个 OnDeserialized 方法;也许 WCF 提供了类似的东西?在这些方法中,您可以有条件地删除数据(尽管请记住,这意味着您的对象已更改,这是序列化的一个非常讨厌的副作用)。
例子:
public class Employee
{
public Address HomeAddress { get; set; }
[OnSerializing]
private void RemoveAddress(StreamingContext context)
{
if (1 == 1) // replace with your condition
HomeAddress = null;
}
[OnDeserialized]
private void PutAddressBack(StreamingContext context)
{
if (1 == 1)
HomeAddress = LoadHomeAddressFromBackingStore();
}
}
【解决方案2】:
我建议不要从 Web 服务直接返回 LINQ to SQL 或 ADO.NET Entity Framework 对象。不幸的是,这将实现细节序列化。例如,基类字段也被序列化,反向链接也是如此。