你能用DataContractSerializer对序列化进行条件控制吗?

时间:2009-04-06 16:54:43

标签: .net serialization datacontractserializer

我正在将我的一些类转换为使用DataContractSerialization,以便我可以在输出中包含Linq实体。我在这个过程中突然出现了一个理论问题,虽然我打赌答案是“不”,但我认为无论如何我都会提出这个问题。

有没有办法有条件地序列化对象?例如,如果我正在序列化一个Employee对象,意图向客户发送信息,我可能不想包含该地址。另一方面,如果我将其序列化为在管理该员工的网站的Web服务中使用,我可能需要该信息。

另一种可能性是根据某些成员是否是被序列化的基础对象来序列化某些成员。因此,如果我有一个包含位置的Ticket类,并且Location包含一个Contacts列表,那么如果我序列化Ticket,我可能不会想要那个联系人列表。但是,如果我尝试使用位置本身,那么拥有它可能会很好。

那么对此有何看法?

2 个答案:

答案 0 :(得分:0)

我还没有使用过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();
    }
}

答案 1 :(得分:0)

我建议不要直接从Web服务返回LINQ to SQL或ADO.NET Entity Framework对象。不幸的是,这序列化了特定于实现的细节。例如,基类类字段也是序列化的,反向链接也是如此。