RedisSessionStateProvider 与 ProtoBuf 序列化导致错误
RedisSessionStateProvider with ProtoBuf serialization causing errors
我正在尝试使用 RedisSessionStateProvider 进行 protobuf 序列化。我已将 redisSerializerType 指定为实现 Microsoft.Web.Redis.ISerializer 的自定义 class - 这是反序列化代码:
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,反序列化的签名使用了 return 类型的对象,并且无法传入被 return 编辑的实际类型。因此,当 DeserializeDirect 尝试使用 Protobuf.Serializer 对其进行反序列化时(如预期的那样)会显示 "Type is not expected, and no contract can be inferred: 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; }
}
我正在尝试使用 RedisSessionStateProvider 进行 protobuf 序列化。我已将 redisSerializerType 指定为实现 Microsoft.Web.Redis.ISerializer 的自定义 class - 这是反序列化代码:
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,反序列化的签名使用了 return 类型的对象,并且无法传入被 return 编辑的实际类型。因此,当 DeserializeDirect 尝试使用 Protobuf.Serializer 对其进行反序列化时(如预期的那样)会显示 "Type is not expected, and no contract can be inferred: 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; }
}