C# Sterling Db未使用自定义序列化
我正在WP7应用程序中使用Sterling DB,并试图实现一个定制的serialiser,希望能提高性能 我将提供一个示例(请原谅所有的格式设置,尝试压缩它以保持较小)。给定继承C# Sterling Db未使用自定义序列化,c#,sterling-db,C#,Sterling Db,我正在WP7应用程序中使用Sterling DB,并试图实现一个定制的serialiser,希望能提高性能 我将提供一个示例(请原谅所有的格式设置,尝试压缩它以保持较小)。给定继承列表的类型: 它调用CanSerialize,但给出的类型是TfromList,类I继承自。如果将string更改为int,它会告诉我类型是int 还有其他人有这个问题吗?这是Sterling发行的还是带有仿制药类型信息的发行? 更新:根据Marc关于继承的建议,我将我的类型修改为: public class Type
列表的类型:
它调用CanSerialize
,但给出的类型是T
fromList
,类I继承自。如果将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>();
}
}
我不熟悉那个序列化程序,但当它来自列表时,序列化程序“接管”它并不少见——使用一种内置机制来表示[n]项,但对每个项依次使用常规管道。我怀疑(纯粹凭直觉)这就是这里正在发生的事情
请注意,因此(与许多其他序列化程序一样),在列表本身上具有值(即ObjectId
)可能是不可取的。我通常使用封装而不是继承:
public class TypedList
{
public Guid ObjectId { get; set; }
private readonly List<string> items = new List<string>();
public List<string> Items { get { return items; } }
}
公共类类型列表
{
公共Guid对象ID{get;set;}
私有只读列表项=新列表();
公共列表项{get{return Items;}}
}
i、 e.有ObjectId和列表的东西,而不是有ObjectId和的东西是一个列表。只是为了它的价值-Sterling希望完全控制“顶级”实体,以便它可以构建键、索引和其他它需要运行的部分。这就是为什么它从不调用顶级实体(定义为具有索引和键的实体)的自定义序列化程序。自定义序列化程序用于这些表的属性。上面的修复是正确的,因为它现在将列表视为一个属性,而不是试图序列化的顶级“项”。对列表上的值进行了良好的分析,这个例子直接来自于我第一次玩Sterling,它不会进入生产:-)我让它与我的问题的例子一样。@Adam当然(*cough*)其他序列化引擎可用;pI根据您的建议做了一个更改,它似乎突出了更多可观察的行为-我现在认为我正在尝试错误地使用序列化提供程序。是的,我使用过protobuf net,但是Sterling的序列化机制是不可插拔的;-)@事实上,看看你的示例代码,我很有信心我可以将protobuf网络插入其中;但这可能会增加不必要的复杂性。我只是漫无边际地说…所有这些的代码都是可用的,序列化部分看起来很简单。试着提供一个补丁:-)如果我盯着代码看的时间足够长,我可能就会明白为什么它要测试类型属性,而不是类型本身lol!关于你的标签的一点评论:我们真的需要sterling
和sterling db
(使用相同的标签维基摘录)?@Paulo不,我本来打算用一个作为别名,但是我没有这样的特权,所以我创建了这两个版本供社区版主决定。在我的情况下,上面的修复并不完全正确,因为我仍在尝试自定义序列化顶级实体TypedList。然而,你的解释回答了这个问题。我怀疑是这样的,因为可以看出它试图查询属性的序列化程序。谢谢你的确认。
_engine = new SterlingEngine();
_engine.SterlingDatabase.RegisterSerializer<TypedListSerializer>();
_engine.Activate();
// _instance is a class that inherits BaseDatabaseInstance from the Sterling code.
_instance.Save<TypedList>(list);
_instance.Flush();
_instance.Load<TypedList>(g); // g is Guid.
public class TypedList
{
public Guid ObjectId { get; set; }
public List<int> Items { get; set; }
public TypedList()
{
Items = new List<int>();
}
}
protected override List<ITableDefinition> RegisterTables()
{
return new List<ITableDefinition>
{
CreateTableDefinition<TypedList, Guid>(l => l.ObjectId)
};
}
public class TypedList
{
public Guid ObjectId { get; set; }
private readonly List<string> items = new List<string>();
public List<string> Items { get { return items; } }
}