2017-05-25 108 views
1

我想获得protobuf序列化与RedisSessionStateProvider工作。我已经指定了redisSerializerType作为实现Microsoft.Web.Redis.ISerializer的自定义类 - 这里是反序列化代码:RedisSessionStateProvider与ProtoBuf序列化导致错误

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签名的反序列化使用返回类型的对象,并且没有办法传入正在返回的实际类型。因此,当DeserializeDirect尝试使用Protobuf.Serializer反序列化它(如预期)所述:“Type不是预期的,并且不能推断出合同:System.Object”。我正在使用.NET框架4.6.1的Web应用程序,我希望有人能指出我做错了什么。

谢谢!

回答

1

通常情况下,protobuf网真的想知道确切的类型。但是,您可以使用DynamicType作弊。这告诉protobuf-net包含额外的类型元数据 - 通常不包括的东西。

请注意,这会使您的代码变得脆弱 - 如果代码中的类型发生变化,它可能会失败!

我将很快实施Any(作为2.3.0的一部分),这是另一种选择。

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,这正是我所需要的! –