C# Sterling Db未使用自定义序列化

C# Sterling Db未使用自定义序列化,c#,sterling-db,C#,Sterling Db,我正在WP7应用程序中使用Sterling DB,并试图实现一个定制的serialiser,希望能提高性能 我将提供一个示例(请原谅所有的格式设置,尝试压缩它以保持较小)。给定继承列表的类型: 它调用CanSerialize,但给出的类型是TfromList,类I继承自。如果将string更改为int,它会告诉我类型是int 还有其他人有这个问题吗?这是Sterling发行的还是带有仿制药类型信息的发行? 更新:根据Marc关于继承的建议,我将我的类型修改为: public class Type

我正在WP7应用程序中使用Sterling DB,并试图实现一个定制的serialiser,希望能提高性能

我将提供一个示例(请原谅所有的格式设置,尝试压缩它以保持较小)。给定继承
列表的类型:

它调用
CanSerialize
,但给出的
类型是
T
from
List
,类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; } }
}