2017-05-25 60 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,這正是我所需要的! –