Warm tip: This article is reproduced from stackoverflow.com, please click
c# redis json.net stackexchange.redis

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

发布于 2020-03-30 21:15:03

I am trying to add a complex object into Redis but while retrieving the values from Redis I am getting certain values as 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. The property CollectionID has two counts with respective values but after getting it from Redis and De-serializing makes the value as null. Please check the below image

The property CollectionID has two values with ID:

enter image description here

The property becomes null while getting it from Redis cache So

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

Questioner
Anish
Viewed
50
LeoMurillo 2020-01-31 19:01

The problem is you don't have a setter on 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. You can add the package JsonNet.PrivateSettersContractResolvers, then add

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

See Private setters in Json.Net.