Я использую Sterling DB в приложении WP7 и пытаюсь реализовать специальный сериализатор для, надеюсь, повышения производительности.
Я приведу пример (извините за все форматирование, пытаясь сжать его, чтобы он был маленьким). Учитывая тип, который наследует List<string>:
public class TypedList : List<string>
{
public Guid ObjectId { get; set; }
public TypedList() { }
public TypedList(int count) : base(count) { }
}
И это сериализатор:
public class TypedListSerializer : Wintellect.Sterling.Serialization.BaseSerializer
{
public override bool CanSerialize(Type targetType)
{
return targetType.Equals(typeof(TypedList));
}
public override object Deserialize(Type type, BinaryReader reader)
{
int count = reader.ReadInt32();
var list = new TypedList(count);
for (int i = 0; i < count; i++)
list.Add(reader.ReadString());
return list;
}
public override void Serialize(object target, BinaryWriter writer)
{
var list = (TypedList)target;
writer.Write(list.Count);
foreach (string s in list)
writer.Write(s);
}
}
Я регистрирую сериализатор с двигателем:
_engine = new SterlingEngine();
_engine.SterlingDatabase.RegisterSerializer<TypedListSerializer>();
_engine.Activate();
Предполагается таблица TypedList
типов. Теперь, когда я пытаюсь сохранить / загрузить этот тип на экземпляре Sterling:
// _instance is a class that inherits BaseDatabaseInstance from the Sterling code.
_instance.Save<TypedList>(list);
_instance.Flush();
_instance.Load<TypedList>(g); // g is Guid.
Он вызывает в CanSerialize
, но Type
, который ему дан, это T
из List<T>
, класса, от которого я наследую. Если вы измените string
на int
, он скажет мне, что тип int
.
Кто-нибудь еще имел эту проблему? Это проблема Стерлинга или информация о типах дженериков?
Обновление : В соответствии с предложением Марка о наследовании я изменил свой тип следующим образом:
public class TypedList
{
public Guid ObjectId { get; set; }
public List<int> Items { get; set; }
public TypedList()
{
Items = new List<int>();
}
}
Похоже, что сериализатор выполняет проверку из TypedList
вместо самого типа. Я предполагаю, что теперь это ошибка с тем, как я использую стерлинг. Моя строка регистрации таблицы выглядит так:
protected override List<ITableDefinition> RegisterTables()
{
return new List<ITableDefinition>
{
CreateTableDefinition<TypedList, Guid>(l => l.ObjectId)
};
}