Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Redis声明标记为DataContract的类不可序列化?_C#_Serialization_Redis_Stackexchange.redis - Fatal编程技术网

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);
     }
 }