C# Redis声明标记为DataContract的类不可序列化?
我有以下代码:C# Redis声明标记为DataContract的类不可序列化?,c#,serialization,redis,stackexchange.redis,C#,Serialization,Redis,Stackexchange.redis,我有以下代码: [DataContract(Namespace = "removed")] public class FootballPlayer { /// <summary> /// Id of the player. /// </summary> [DataMember] public int Id { get; set; } /// <summary> /// Name of the player. /// &
[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接受DataContractSerializer作为“已接受”的序列化器(?)
我不想回顾我所有的类并标记为[Serialiazble]——我希望[DataContract]和[DataMember]能为我做到这一点(对于AppFabric来说这很好)…Redis本身肯定不知道DataContractAttribute,甚至不知道.NET本身 AFAIK的StackExchange.Redis也不知道,也就是说它没有内置的支持,至少没有一次成功 下面是我使用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();
}
}
当然,您可能希望将这些内容隐藏在一些抽象或扩展方法后面
最后,您可能希望重新考虑您的设计本身。根据应用程序的不同,在redis中不要将完整的对象(图形)存储为blob,而是将单个属性存储为单个键(以及关联的值),这可能很有价值。因此,如果您只需要一个(或两个)属性,就不会有序列化/传输/反序列化整个字节块的成本-当然,您可能会有更多的网络往返。正如我所说,这取决于你的申请
此外,您可以使用Redis的API(甚至LUA脚本)高效地操作和处理数据,而无需首先传输数据。您可以使用Redis'或命名方案(例如,
users..age
)来实现这一点。通过使用datacontract属性,我希望它已经可以序列化了-根据datacontract摘要-“指定该类型定义或实现数据协定,并可由序列化程序(如System.Runtime.Serialization.DataContractSerializer)序列化”-我正在寻找一种方法,以便不需要将所有类标记为[serializable]同样-例如,我没有针对AppFabric,因此它与上面的不同。是否引发异常?如果是,您能否共享完整的ToString()
异常的输出,包括异常类型、消息和回溯?DataContractSerializer
与可序列化无关,它们是完全独立的序列化机制。无论引发异常的是什么,显然都希望使用后者。从StackExchange.Redis文档的简要介绍中可以看出,API接受一个字符串值,所以我认为您需要添加导致异常的代码。
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();
}
}
private static T GetObject<T>(byte[] buffer) {
using (var m = new MemoryStream(buffer)) {
var ser = new DataContractSerializer(typeof(T));
return (T)ser.ReadObject(m);
}
}