2017-05-25 3 views
1

私はRedisSessionStateProviderで動作するprotobufシリアル化を取得しようとしています。私はMicrosoft.Web.Redis.ISerializerに署名を実装する必要があるとしてProtoBufシリアル化でエラーが発生するRedisSessionStateProvider

public object Deserialize(byte[] data) 
    { 
     return DeserializeDirect(data); 
    } 

    private object DeserializeDirect(byte[] data) 
    { 
     using (var memoryStream = new MemoryStream(data)) 
     { 
      return Serializer.Deserialize<object>(memoryStream); 
     } 
     return null; 
    } 

はデシリアライズが使用するために: - 私はMicrosoft.Web.Redis.ISerializerを実装するカスタムクラスとしてredisSerializerTypeを指定しているここで、デシリアライゼーションコードです返される実際の型を渡す方法はありません。したがって、DeserializeDirectがProtobuf.Serializerを使用してデシリアライズしようとすると(期待どおりに)「タイプは期待されておらず、契約は推測できません:System.Object」と表示されます。私は.NET Framework 4.6.1でWebアプリケーションを使用しています。私が間違っていることを誰かが指摘できると思っていました。

ありがとうございます!

答えて

1

通常、protobuf-net 実際にはは、正確なタイプを知りたいと考えています。ただし、DynamicTypeを使用して不正行為をすることはできます。これは、protobuf-netに追加のタイプのメタデータを含めるように指示します。通常は含まれません。

これはコードが脆くなることがあることに注意してください。タイプがコード内で変更されると失敗する可能性があります。

すぐに(2.3.0の一部として)Anyを実装します。これは別のオプションです。

public static void Main() 
{ 
    // the actual object we care about 
    object obj = new Foo { X = 1 }; 

    // serialize and deserialize via stub 
    var stub = new Stub { Data = obj }; 
    var clone = Serializer.DeepClone(stub); 
    // prove it worked 
    Console.WriteLine(clone.Data); 
    // prove it is a different instance 
    Console.WriteLine(ReferenceEquals(obj, clone.Data)); 
} 
[ProtoContract] 
public class Foo 
{ 
    [ProtoMember(1)] 
    public int X { get; set; } 
    public override string ToString() => $"X={X}"; 
} 

[ProtoContract] 
public sealed class Stub 
{ 
    [ProtoMember(1, DynamicType = true)] 
    public object Data { get; set; } 
} 
+0

ありがとうMarc、これは私が必要としていたものです! –

関連する問題