简体   繁体   English

从 Redis 获取复杂对象时,值为 null

[英]Values are being null while getting it from Redis for complex objects

I am trying to add a complex object into Redis but while retrieving the values from Redis I am getting certain values as null.我正在尝试将一个复杂的对象添加到 Redis 中,但是在从 Redis 检索值时,我将某些值设为 null。 Below is the rough sample I am trying.下面是我正在尝试的粗略样本。 I have an complex object, I serialize that complex object using JsonConvert and add it in the Redis.我有一个复杂对象,我使用 JsonConvert 序列化该复杂对象并将其添加到 Redis 中。 The property CollectionID has two counts with respective values but after getting it from Redis and De-serializing makes the value as null.属性 CollectionID 有两个具有各自值的计数,但是在从 Redis 和反序列化获取它之后,该值会变为空值。 Please check the below image请检查下图

The property CollectionID has two values with ID:属性 CollectionID 有两个带 ID 的值:

在此处输入图片说明

The property becomes null while getting it from Redis cache从 Redis 缓存中获取时,该属性变为 null 所以

Below is the sample:下面是示例:

class Program
{
    private static IDatabase _cache;
    private static ConnectionMultiplexer _connection;

    static void Main(string[] args)
    {
        _connection = ConnectionMultiplexer.Connect("localhost");
        _cache = _connection.GetDatabase();

        List<Id> id = new List<Id>() { new Id() { ID = 10 }, new Id() { ID = 20 } };
        Collection<Customers> collection = new Collection<Customers>() { new Customers(id) };
        Product product = new Product(new Guid(), collection, 1);
        _cache.StringSet("Redis_Key", GetSerializedString(product));
        var value = JsonConvert.DeserializeObject<Product>(_cache.StringGet("Redis_Key"));
    }

    private static String GetSerializedString<Test1>(Test1 value)
    {
        return JsonConvert.SerializeObject(
                    value,
                    Formatting.Indented,
                    new JsonSerializerSettings
                    {
                        ReferenceLoopHandling = ReferenceLoopHandling.Serialize,
                        PreserveReferencesHandling = PreserveReferencesHandling.All
                    });
    }
}

public class Product
{
    public Product(
        Guid parentGuid,
        Collection<Customers> collection,
        int number)
    {
        _parentGuid = parentGuid;
        _collection = collection;
        _number = number;
    }

    private Guid _parentGuid;
    public Guid ParentGuid
    {
        get { return _parentGuid; }
    }

    private Collection<Customers> _collection;
    public Collection<Customers> Collection
    {
        get { return _collection; }
    }

    private int _number;
    public int number
    {
        get { return _number; }
    }
}

public class Customers
{
    public Customers(IEnumerable<Id> id)
    {
        _id = id;
    }

    private IEnumerable<Id> _id;

    public IEnumerable<Id> CollectionID
    {
        get { return _id; }
    }
}

public class Id
{
    public int ID { get; set; }
}

Any suggestions would be of much help.任何建议都会有很大帮助。

Thanks, Anish谢谢,安尼什

The problem is you don't have a setter on CollectionID .问题是您在CollectionID上没有设置器。

public IEnumerable<Id> CollectionID
{
    get { return _id; }
    set { _id = value; } //need a setter
}

If you need the setter to be private , you can do so but you will need a ContractResolver .如果你需要 setter 是private ,你可以这样做,但你需要一个ContractResolver You can add the package JsonNet.PrivateSettersContractResolvers , then add您可以添加包JsonNet.PrivateSettersContractResolvers ,然后添加

using JsonNet.PrivateSettersContractResolvers;
...
var value = JsonConvert.DeserializeObject<Product>(_cache.StringGet("Redis_Key"),
        new JsonSerializerSettings
        {
            ContractResolver = new PrivateSetterContractResolver()
        });

See Private setters in Json.Net .请参阅Json.Net 中的私有设置器

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM