我在 WP7 应用程序中使用 Sterling DB 并尝试实现自定义序列化程序,希望能提高性能。
我将提供一个示例(请原谅所有格式,尝试压缩它以使其保持小)。给定一个继承的类型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.
它调用 into CanSerialize
,但Type
给出的是T
from List<T>
,我继承的类。如果您更改string
为int
,它会告诉我类型是int
.
有没有其他人有这个问题?这是 Sterling 问题还是带有泛型类型信息的问题?
更新:根据 Marc 关于继承的建议,我将类型修改为以下内容:
public class TypedList
{
public Guid ObjectId { get; set; }
public List<int> Items { get; set; }
public TypedList()
{
Items = new List<int>();
}
}
序列化程序似乎在做的是检查属性而 TypedList
不是类型本身。我猜这现在是我使用 Sterling 的一个错误。我的表注册行如下所示:
protected override List<ITableDefinition> RegisterTables()
{
return new List<ITableDefinition>
{
CreateTableDefinition<TypedList, Guid>(l => l.ObjectId)
};
}