Я использую кэш C# StackExchange.Redis и пытаюсь кэшировать объект, содержащий набор объектов интерфейса. Кэш работает нормально, но десериализация выдает ошибку:
Could not create an instance of type IMyInterface. Type is an interface or abstract class and cannot be instantiated.
Если бы я сам занимался десериализацией, я понимаю, что мог бы создавать собственные правила десериализации через этот ТАК опубликовать:
var obj = JsonConvert.DeserializeObject <MyParentClass>(json, new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.Auto,
Binder = binder // write some custom deserialization rules
});
Однако у меня нет доступа к процессу десериализации, потому что он обрабатывается Redis/Newtonsoft.Json. Кстати, я использую StackExchange.Redis 1.1.0.0 и Newtonsoft.Json 9.0.0.0.
Я также нашел этот сообщение SO об указании serialVersionUID
, однако это явно для Java, как указано в этом сообщении SO.
Итак, что мне не хватает или каковы мои варианты? Заранее спасибо!
Вот пример кода для работы:
public interface IMyInterface
{
string Name { get; set; }
}
public class MyChildClassA : IMyInterface
{
public string Name { get; set; }
}
public class MyChildClassB : IMyInterface
{
public string Name { get; set; }
}
public class MyParentClass
{
public IList<IMyInterface> Children { get; set; }
// Assume proper init of list in constructor
}
public void DoStuff()
{
var parentValue = new MyParentClass();
// Assume parentValue.Children contains objects of both MyChildClassA and MyChildClassB
// Works!
MyCacheImplementation.Add<MyParentClass>(someKey, parentValue);
// Does NOT work!
MyCacheImplementation.Get<MyParentClass>(someKey);
}