【发布时间】:2012-04-13 21:06:07
【问题描述】:
有这样的.proto文件结构
{
session{
field1 = value;
field2 = value;
...
}
object1{
Object1field1 = value;
Object1field2 = value;
...
}
object1{
Object1field1 = value;
Object1field2 = value;
...
}
object2{
Object2field1 = value;
Object2field2 = value;
...
SubObject1{
SubObject1field1 = value;
SubObject2field2 = value;
...
}
} object2{
Object2field1 = value;
Object2field2 = value;
...
SubObject1{
SubObject1field1 = value;
SubObject2field2 = value;
...
}
}
} 简单地说具有复杂的层次结构。例如,Object1 或 Object2 可以是可重复的。是否可以编写通用方法,将字段值作为基础对象(如 int、bool、string、datetime 或简单的字符串)返回?我想通过字符串文字获得以下访问权限:
public object GetFieldValue(int number, string fullPath)
fullPath 可以这样指定,例如:
fullPath = "object1.Object1field1";
重复字段所需的数字:例如,对于第一个“object1”,数字可以等于 0,而对于第二个,数字可以等于 1。获取object1的必要方法也是按字段名称重复计数:
public int GetFieldCount(string fieldName)
并且还需要类似的方式来访问子对象到任何嵌套级别。那可能吗?是否有替代协议缓冲区硬编码类的方法?
【问题讨论】:
-
您目前使用的是什么协议缓冲区库?
-
似乎是 protobuf-csharp-port,它们为我的项目提供了预生成的类和 Google.ProtocolBuffers.dll。哪一个更适合这样的任务?这两个 C# Protocol Buffers 库的文档和示例都很少。
-
我还可以问:在我看来,这样做的主要方法是反序列化数据,然后使用反射(或类似 FastMember 的东西)按名称获取值。这是一个选项吗?如果不知道对象定义,则无法通过名称访问,因为 protobuf 不存储名称。
-
是的,数据已反序列化。当然我知道对象定义,但我想通过存储的用户定义设置(映射)来访问流程字段的一些通用方法,比如提到的“object1.Object1field1”。因为我有数百个我想自动阅读的字段。在其他情况下,我需要对每个进行硬编码 - 不是很好。为什么 pbuff 不提供这样的?!在这种情况下,它不如 XML 方便。
-
为什么不将其反序列化为一些可以自动访问的更简单的结构,例如:Dictionary
,例如,其中 string 是字段名称,而 object 可以是:int, string,嵌套级别的布尔值、日期时间和下一个字典 ?
标签: c# protocol-buffers