c# - RedisSessionStateProvider 与 ProtoBuf 序列化导致错误

标签 c# redis protobuf-net stackexchange.redis

我正在尝试使用 RedisSessionStateProvider 进行 protobuf 序列化。我已将 redisSerializerType 指定为实现 Microsoft.Web.Redis.ISerializer 的自定义类 - 这是反序列化代码:

    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 对其进行反序列化时(如预期的那样)说“类型不是预期的,并且无法推断出契约(Contract):System.Object”。我正在使用带有 .NET Framework 4.6.1 的网络应用程序,我希望有人能指出我做错了什么。

谢谢!

最佳答案

通常,protobuf-net 真的想知道确切的类型。但是,您可以使用 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; }
}

关于c# - RedisSessionStateProvider 与 ProtoBuf 序列化导致错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44191342/

相关文章:

c# - 如何允许用户在我的 MVC 网站上创建自己的子域?

php - Laravel Redis 队列忽略限制

c# - 序列化包含大字节数组的对象列表时抛出 OutOfMemoryException

protocol-buffers - "1", "2", "3"在protobuf中是什么意思?

c# - ProtoBuff.Net 不支持 null。为什么?

c# - 使用 C# 保存 powerpoint 文件

java - 十进制负数和正数之和

c# - WCF 休息方法 - 该网页不可用

asp.net-mvc - 带有 Redis 的 SignalR 将消息发送到特定的 ConnectionID

redis - Redis MATCH操作中如何使用OR条件