2012-03-02 75 views
2

从我读到/看到的有3种方法来定义protobuf模型,使用.proto文件,使用类装饰和运行时调用来添加类型和字段。我正在寻找的是一种更像FluentNhibernate的方式,其中模型的定义被移除以单独为每个类别的程序分离文件以使模型更清洁。在这一思路中,我创建了一个类Buffer<T>,它在实例化时将它定义的类添加到类型模型中。是否有可能在protobuf-net中合并RuntimeTypeModel

public class CustomerBuffer : Buffer<Customer> 
{ 
    public CustomerBuffer() 
    { 
     Add("ID"); 
     Add("SyncID"); 
     Add("AccountNumber"); 
     Add("Reference"); 
     Add("Contact"); 
     Add("Address"); 
     Add("CreditInformation"); 
    } 
} 

应用于Buffer<T>构造函数被创建的,因此时可用派生类构造函数被调用的类型模型。

当一切都被添加时,我需要能够将模型合并在一起,以便它们可以被编译。

到目前为止,我已经试过这样:

foreach(MetaType MT in model.GetTypes()) 
{ 
    InternalModel.Add(MT.Type, false); 
} 

这显然不会,因为它的工作不是复制原始元类型的字段信息。

所以我正在寻找一个工作,可以让我搜索并从一个装配(或多个装配)中将Buffer<T>派生的所有类型添加到类型模型中,然后进行编译。

+0

不,目前没有提供;我真的很想更好地理解你在这里做什么; “合并模型”听起来像是一个**解决方案** - 你能告诉我你正试图解决的**问题是什么,以便我能够了解如何最好地解决它? – 2012-03-02 13:20:49

+0

作为一个例子,这里有一个现有的建议是添加一个遇到新类型时调用的事件,从而允许规则即时应用(而不是全部预先)。 – 2012-03-02 13:27:26

+0

@MarcGravell是合并/复制从一个TypeModel的MetaTypes到另一个更像是一个解决方案。我想要做的是定义一个Customer,如问题所示,通过发现程序集中的所有“映射”,以与Fluent Nhibernate相同的方式定义一个“映射”。所以我需要为.AddFromAssemblyOf实现一个发现所有protobuf-net“地图”的实现。由于地图中的唯一信息在构造函数中,所以我无法在模型构建之前将模型实例传递给缓冲区。想法是在构造函数完成后收集它。 – 2012-03-02 13:42:33

回答

1

通过对类型模型使用Singleton来解决此问题。这样我就不需要合并类型模型,因为所有东西都被添加到相同的模型中。是否需要向AddSubType添加覆盖,以便可以在不使用类型编号的情况下调用它。这现在很好用。

更新

这使我至今都基于类的初始化命令2级的错误被添加。

“无法将类型x转换为y类型”在基类在子类之后初始化时在ProtoWriter和ProtoReader中发生。 - 这是解决通过添加一个排序算法来包装protobufcfg类找到所有类型初始化和实际初始化它们之间。

“检测到可能的递归”当父对象包含属于子对象的属性在子对象后面初始化并且子对象包含“父对象”属性时发生。

UPDATE2

这两种错误是通过我的AsReference属性,是动态的,以及对孩子的“家长”属性参考,并需要从列表中删除了需要的滥用。

1

看看Fluent protobuf-net:它确实是你想要的,我想(例如,流利的NHibernate样)。

+0

哦,我写了自己的简单流利的API来处理它。现在不记得太多了。这在18个月前对我来说是完美的! – 2013-09-20 08:34:00