【问题标题】:How to write a custom serializer by using DataContractSerializer for generic type?如何使用 DataContractSerializer 为泛型类型编写自定义序列化程序?
【发布时间】:2012-10-03 11:54:18
【问题描述】:

我想编写一个自定义序列化程序,用于将会话状态存储到 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 序列化模式改成了“单向”

【问题讨论】:

    标签: c# asp.net serialization azure


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-10
      • 1970-01-01
      • 2017-01-04
      • 2016-07-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多