是否可以合并RuntimeTypeModel';s在protobuf网络中
本文关键字:protobuf 网络 合并 RuntimeTypeModel 是否 | 更新日期: 2023-09-27 18:26:38
根据我所读到的内容,有三种方法可以定义protobuf的模型,包括.proto文件、类装饰和添加类型和字段的运行时调用。我正在寻找一种更像Fluenthibernate的方法,其中删除了模型的定义,将每个类的文件从程序中单独分离出来,使模型更干净。根据这一思路,我创建了一个类Buffer<T>
,当它被实例化时,它将定义的类添加到类型模型中。
public class CustomerBuffer : Buffer<Customer>
{
public CustomerBuffer()
{
Add("ID");
Add("SyncID");
Add("AccountNumber");
Add("Reference");
Add("Contact");
Add("Address");
Add("CreditInformation");
}
}
所使用的类型模型是在CCD_ 2构造函数中创建的,因此在调用派生类构造函数时它是可用的。
添加完所有内容后,我需要能够将模型合并在一起,以便对其进行编译。
到目前为止,我已经尝试过这个:
foreach(MetaType MT in model.GetTypes())
{
InternalModel.Add(MT.Type, false);
}
这显然不起作用,因为它没有复制原始MetaType上的字段信息。
因此,我正在寻找一种解决方案,它将允许我搜索一个程序集(或多个程序集)中从Buffer<T>
派生的所有类型,并将其添加到类型模型中,然后对其进行编译
通过对类型模型使用Singleton来解决此问题。这样我就不需要合并类型模型,因为所有的东西都添加到了同一个模型中。确实需要向AddSubType添加重写,以便可以在没有类型号的情况下调用它。现在效果很好。
更新
到目前为止,这导致了我两个错误,都是基于所添加类的初始化顺序。
当基类在子类之后初始化时,在ProtoWriter和ProtoReader中发生"无法将类型x强制转换为类型y"。-通过在查找所有要初始化的类型和实际初始化它们之间添加排序算法来包装protobufcfg类,已经解决了这一问题。
"检测到可能的递归"发生在包含子项列表属性的父项在该子项之后初始化并且该子项包含"Parent"属性时。
更新2
这两个错误都是由于我滥用了AsReference属性,它需要是动态的,也需要引用子级的"Parent"属性,需要从列表中删除。
看看Fluent protobuf net:我认为它正是你想要的(例如,Fluent NHibernate喜欢)。