4

セッション状態をAzure Cache (プレビュー)に格納するためのカスタム シリアライザーを作成したいので、このカスタム シリアライザーを実装する必要がありますIDataCacheObjectSerializer(間違っている場合はお知らせください)。System.Data.Linq.EntitySetこのカスタム シリアライザーを作成する必要がある理由は、いくつかの属性を含むいくつかの Linq オブジェクトをシリアル化する必要があるためです。また、デフォルトのシリアライザーNetDataContractSerializerは、EntitySet.

私の計画は、を使用してカスタムシリアライザーを作成することですDataContractSerializer( can serializeについて言及したいくつかの記事を検索したので、間違っている場合はお知らせくださいDataContractSerializerEntitySet) が、問題はジェネリック型をサポートできるカスタムシリアライザーを作成する方法です。

現在、カスタムシリアライザーのコードは次のようになっています。

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のシリアル化モードを「単方向」に変更しました

4

1 に答える 1

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);
    }
}
于 2012-10-05T20:10:19.257 に答える