我想将一个复杂的对象添加到Redis中,但是在从Redis中检索值时,我将某些值设为null。以下是我尝试的粗略示例。我有一个复杂的对象,我使用JsonConvert序列化了这个复杂的对象,并将其添加到Redis中。属性CollectionID具有两个带有各自值的计数,但是从Redis获取并进行反序列化后,该值将为null。请检查下图
属性CollectionID具有两个带有ID的值:
下面是示例:
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; }
}
任何建议都会有很大帮助。
谢谢阿尼什
问题是您没有设置器CollectionID
。
public IEnumerable<Id> CollectionID
{
get { return _id; }
set { _id = value; } //need a setter
}
如果您需要二传手private
,则可以这样做,但您需要一个ContractResolver
。您可以添加包JsonNet.PrivateSettersContractResolvers,然后添加
using JsonNet.PrivateSettersContractResolvers;
...
var value = JsonConvert.DeserializeObject<Product>(_cache.StringGet("Redis_Key"),
new JsonSerializerSettings
{
ContractResolver = new PrivateSetterContractResolver()
});
请参阅Json.Net中的专用设置器。
谢谢狮子座,它的工作
您好,Leo,您的建议有效,但在另一种情况下,类“ Id”继承了ISerializable类,并且将值返回为空。JsonConvert是否可以序列化已经自定义序列化的类?
听起来像是一个有效的新问题,请在其他问题中发布更多详细信息