请教关于运行时类型识别

lilnelse
不折腾 2014-07-14 字数 382

有这样一个需求 就是从设备上采集各种数据显示在UI上

问题是 数据的类型不定 比如int double string bool 甚至自定义的enum

现在想用一个通用的结构体保存这些数据 比如

struct Item {

int id;

string name;

object value;

enum type

// ...

};

这样只能在运行时根据type获取到类型信息 再转换到相应的类型 感觉不太方便 而且遇到新的enum类型还得修改type的定义

请问是否有更好的方案?

PS 语言会用到C++(后台)和C#(UI)

Programming 编程技术
17 个回复
lookover
where is a will, there is a way 2014-07-14

json

【 在 lilnelse (不折腾) 的大作中提到: 】

: 有这样一个需求 就是从设备上采集各种数据显示在UI上

: 问题是 数据的类型不定 比如int double string bool 甚至自定义的enum

: 现在想用一个通用的结构体保存这些数据 比如

: ...................

lilnelse
不折腾 2014-07-14

谢谢 请问用json怎么弄?json不是用来做序列化/反序列化的么?

【 在 lookover (轮回) 的大作中提到: 】

: json

lookover
where is a will, there is a way 2014-07-14

自己找库

【 在 lilnelse (不折腾) 的大作中提到: 】

: 谢谢 请问用json怎么弄?json不是用来做序列化/反序列化的么?

lilnelse
不折腾 2014-07-14

json.net?

【 在 lookover (轮回) 的大作中提到: 】

: 自己找库

icebupt
ice 2014-07-14

C# DynamicObject, ExpandoObject

【 在 lilnelse 的大作中提到: 】

: 有这样一个需求 就是从设备上采集各种数据显示在UI上

: 问题是 数据的类型不定 比如int double string bool 甚至自定义的enum

: 现在想用一个通用的结构体保存这些数据 比如

: ...................

lilnelse
不折腾 2014-07-14

谢谢 那C++那边呢?

【 在 icebupt (ice) 的大作中提到: 】

: C# DynamicObject, ExpandoObject

hehao
_CTYPE 2014-07-15

jansson

【 在 lilnelse (不折腾) 的大作中提到: 】

: 谢谢 那C++那边呢?

redbird314
苦逼100年啊100年 2014-07-15

你这设计好奇怪,走弯路了吧哥们

【 在 lilnelse 的大作中提到: 】

: 有这样一个需求 就是从设备上采集各种数据显示在UI上

: 问题是 数据的类型不定 比如int double string bool 甚至自定义的enum

: 现在想用一个通用的结构体保存这些数据 比如

: ...................

lilnelse
不折腾 2014-07-15

哦?那你觉得应该怎样设计?

【 在 redbird314 (苦逼100年啊100年) 的大作中提到: 】

: 你这设计好奇怪,走弯路了吧哥们

redbird314
苦逼100年啊100年 2014-07-16

你的原始数据永远以字节流形式存在,不同类型的解释由消费者这边来理解,你看看iostream的做法,或者重载一下iostream

【 在 lilnelse 的大作中提到: 】

: 哦?那你觉得应该怎样设计?

lilnelse
不折腾 2014-07-16

嗯 数据是以流或包的形式传过来的 不过我的问题是解析之后的格式

不同数据包里的数据类型不同 现在我们不想hard code(为了以后支持更多的数据包考虑)

打算定义一个“通用的”数据结构 就遇到了这个问题

谢谢解答

【 在 redbird314 (苦逼100年啊100年) 的大作中提到: 】

: 你的原始数据永远以字节流形式存在,不同类型的解释由消费者这边来理解,你看看iostream的做法,或者重载一下iostream

worklife
work & life 2014-07-16

protobuf应该是你想要的

【 在 lilnelse (不折腾) 的大作中提到: 】

: 嗯 数据是以流或包的形式传过来的 不过我的问题是解析之后的格式

: 不同数据包里的数据类型不同 现在我们不想hard code(为了以后支持更多的数据包考虑)

: 打算定义一个“通用的”数据结构 就遇到了这个问题

: ...................

redbird314
苦逼100年啊100年 2014-07-16

为什么会hardcode呢?

比如定义像scanf的format “%d %x %u”等记法来匹配你的输入流,以后增加了新的包不需要改程序逻辑,你可以看看程序设计实践那本书的的记法一章,好像和你这个问题很像,或者我理解错了

【 在 lilnelse 的大作中提到: 】

: 嗯 数据是以流或包的形式传过来的 不过我的问题是解析之后的格式

: 不同数据包里的数据类型不同 现在我们不想hard code(为了以后支持更多的数据包考虑)

: 打算定义一个“通用的”数据结构 就遇到了这个问题

: ...................

lilnelse
不折腾 2014-07-16

搜了下 似乎不错 看看能不能用到我们的项目里 谢谢

【 在 worklife (work & life) 的大作中提到: 】

: protobuf应该是你想要的

lilnelse
不折腾 2014-07-16

呃 也许是我没表述清楚吧 呵呵

thx anyway~

【 在 redbird314 (苦逼100年啊100年) 的大作中提到: 】

: 为什么会hardcode呢?

: 比如定义像scanf的format “%d %x %u”等记法来匹配你的输入流,以后增加了新的包不需要改程序逻辑,你可以看看程序设计实践那本书的的记法一章,好像和你这个问题很像,或者我理解错了

Schlafgern
婆婆大的 2014-07-16

感觉你想要的就是类似java里面Object的toString这样的东西,非常典型的接口继承场景

1 你想让所有类型有一个tostring的方法,这样你可以调用一个统一的接口去写逻辑代码

2 所有的类型有一个接口实现tostring方法

3 做一个类型factory一样的东西专门负责生成这些类型对象

这样你的代码逻辑层面上就不需要关系具体类型了,而且如果添加新类型就是写新类型的tostring方法和它的构造方法,脏代码都在factory和具体每个类型的实现中,逻辑层面代码就不用动了

【 在 lilnelse 的大作中提到: 】

: 呃 也许是我没表述清楚吧 呵呵

: thx anyway~

: ...................

goodtaste
有乐享乐,没乐刨乐 2014-08-10

你这多浪费内存。老老实实加一个type字段,然后根据不同type做不同的处理呗。

【 在 lilnelse (不折腾) 的大作中提到: 】

: 有这样一个需求 就是从设备上采集各种数据显示在UI上

: 问题是 数据的类型不定 比如int double string bool 甚至自定义的enum

: 现在想用一个通用的结构体保存这些数据 比如

: ...................