gpt4 book ai didi

c# - Redis 声明标记为 DataContract 的类不可序列化?

转载 作者:IT王子 更新时间:2023-10-29 06:09:46 24 4
gpt4 key购买 nike

我有以下代码:

[DataContract(Namespace = "removed")]
public class FootballPlayer
{
/// <summary>
/// Id of the player.
/// </summary>
[DataMember]
public int Id { get; set; }

/// <summary>
/// Name of the player.
/// </summary>
[DataMember]
public string Name { get; set; }

当我尝试填充我的 redis 缓存时,出现以下错误:

Additional information: Type  'FootballApp.PlayerBase.Contract.FootballPlayer' in Assembly 'FootballApp.PlayerBase.Contract, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable.

我应该做些什么来告诉 Redis 接受 DataContractSerializer 作为“已接受”的序列化器(?)以获得更好的术语?

我不想返回我的所有类(class)并标记为 [Serialiazble] - 我希望(因为它对 AppFabric 很好)[DataContract] 和 [DataMember] 为我做这件事......

最佳答案

Redis 本身肯定不知道 DataContractAttribute,甚至 .NET 本身也不知道。

StackExchange.Redis,AFAIK,也不知道它,也就是说它没有内置支持 - 至少 a search in the GitHub repository不会产生一次命中。

这是我使用 StackExchange.Redis 在 Redis 中存储“DataContract 对象”所做的工作——手动序列化/反序列化它们:

 private static byte[] GetBuffer<T>(T obj) {
using (var m = new MemoryStream()) {
var ser = new DataContractSerializer(obj.GetType());
ser.WriteObject(m, obj);
return m.ToArray();
}
}

然后您可以从该字节数组构造一个 RedisValue实例,它是 StackExchange.Redis 用来处理从 Redis 存储/检索的值的“原语”。

说到检索,您需要使用反向函数将字节数组反序列化回对象实例:

 private static T GetObject<T>(byte[] buffer) {
using (var m = new MemoryStream(buffer)) {
var ser = new DataContractSerializer(typeof(T));
return (T)ser.ReadObject(m);
}
}

当然,您可能希望将这些东西隐藏在一些抽象或扩展方法之后。

最后,您可能想要重新考虑您的设计本身。根据您的应用程序,不将完整的对象(图形)存储为 Redis 中的 blob,而是将单个属性存储为单个键(和关联值)可能是有值(value)的。因此,如果您只需要一个(或几个)属性,您将不会有序列化/传输/反序列化整个字节 block 的成本 - 当然您可能会有更多的网络往返。正如我所说,这取决于您的应用。

此外,您可以使用 Redis 的 API(甚至 LUA 脚本)有效地操作和使用您的数据,甚至无需首先传输数据。您可以使用 Redis 的 data types或命名方案(例如 users.<name>.age )来实现这一目标。

关于c# - Redis 声明标记为 DataContract 的类不可序列化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38439064/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com