如何使用DataContractSerializer为泛型类型编写自定义序列化程序?

时间:2012-10-03 11:54:18

标签: c# asp.net serialization azure

我想编写一个自定义序列化程序,用于将会话状态存储到 Azure缓存(预览)中,这意味着此自定义序列化程序必须实现IDataCacheObjectSerializer(如果我是)错了,请让我知道)。我需要编写这个客户序列化程序的原因是我需要序列化一些包含一些System.Data.Linq.EntitySet属性的Linq对象。默认序列化程序NetDataContractSerializer无法序列化EntitySet

我的计划是使用DataContractSerializer编写自定义序列化程序(我搜索了一些提及DataContractSerializer的文章可以序列化EntitySet,所以如果我错了,请告诉我请),但问题是如何编写可以支持泛型类型的自定义序列化程序。

目前,我的自定义序列化程序代码如下:

public class CustomSerializer : IDataCacheObjectSerializer
{
    public CustomSerializer()
    { }
    public object Deserialize(System.IO.Stream stream)
    {
        /* How can I know the type of object?????? */
        DataContractSerializer dcs = new DataContractSerializer("Type of object");
    }

    public void Serialize(System.IO.Stream stream, object value)
    {
        DataContractSerializer dcs = new DataContractSerializer(value.GetType());
        dcs.WriteObject(stream, value);
    }
}

顺便说一句,我已将Linq序列化模式更改为“单向”

1 个答案:

答案 0 :(得分:2)

我没有使用IDataCacheObjectSerializer,但常见的解决方案如下:

public sealed class CustomSerializer<T> : IDataCacheObjectSerializer
{
    object IDataCacheObjectSerializer.Deserialize(System.IO.Stream stream)
    {       
        DataContractSerializer dcs = new DataContractSerializer(typeof(T));
        return dcs.ReadObject(stream);
    }

    void IDataCacheObjectSerializer.Serialize(System.IO.Stream stream, object value)
    {
        if (!(value is T)) 
        {
            throw new AgrumentException();
        }
        DataContractSerializer dcs = new DataContractSerializer(typeof(T));
        dcs.WriteObject(stream, value);
    }
}