8


http://msdn.microsoft.com/en-us/devlabs/hh975426.aspx上阅读有关演员的信息时, 我注意到关于序列化的部分:

由于序列化对程序的正确功能至关重要,而且很容易出错,因此 C++ Actors 库包含一个简单的消息定义生成工具“msgtool”,给定 XML 文档将创建必要的类型和序列化定义。

我在 VS 命令提示符下或使用 Google 搜索时找不到 msgtool。

4

2 回答 2

6

这是卡萨布兰卡项目的一部分,该项目是微软的一个孵化项目,由 DevLabs 集团拥有。这是一个非常新鲜的项目,我第一次听说它是在大约 3 个月前。它可能会持续更长时间,不确定。

您不会在标准 VS 发行版中找到任何 Casablanca 工具,该项目距离成为核心收缩包装的 Microsoft 产品还有很长的路要走。孵化项目是探索有前途的技术的工具,总有一天会得到回报。微软从不羞于公开他们正在做的事情,从客户那里获得反馈以找出哪些有效,哪些无效。没有“不要将手指放在手机天线上”的惊喜。

他们肯定在逆向云计算的主要趋势,他们使用的是原生 C++。这在 VM 语言领域已经存在很长时间了。反射支持是一项非常重要的资产。但很明显,要使这些工作顺利进行,可靠地序列化 C++ 对象是一项主要要求,这一点非常重要。因此这个“msgtool”。

该项目的登录页面在这里。他们为 VS2010、VS2012 和最新的 Express 版本提供安装程序。单击右侧的按钮以启动它。我实际上并没有尝试过,但你应该在安装后得到“msgtool.exe”。确保你可以处理一个项目在承诺之后就会破产,这是微软这类项目最典型的结果。


更新:请注意,DevLabs 站点上不再提供链接的网页。真正的项目主页提到:

DevLabs 网站上不再提供我们的文档,仅在下载的文件中提供

您可以在 Casablanca_Samples.zip\Documents\actors.html 中找到链接页面的副本。导航到“序列化”部分并比较两者。在提到“msgtool”的确切位置,您现在会看到它在谈论msg_ptr<T>模板类。所以,是的,看起来这个工具似乎不再支持或包含在当前的 SDK 中,如果它曾经是的话。

于 2013-01-12T23:31:42.717 回答
1

给你,在 python 中——又快又脏!当然,错了,但你明白我希望的想法!

import xml.dom.minidom


s = ''' 
<Namespace name="test">
  <Message name="FooBar">
    <Type name="T"/>
    <Field name="a" type="std::string"/>
    <Field name="b" type="T"/>
    <Field name="d" type="std::string"/>
  </Message>
</Namespace>
'''

dom = xml.dom.minidom.parseString(s)

messages = []

def parseMessage(node):
    print 'class', node.attributes['name'].value, '{'
    for type in node.getElementsByTagName('Type'):
        print 'template<typename', type.attributes['name'].value, '>'
    for field in node.getElementsByTagName('Field'):
        print field.attributes['type'].value, field.attributes['name'].value, ';'
    print '}'
    messages.append(node)


def parseNamespace(node):
    print 'namespace', node.attributes['name'].value, '{'
    for child in node.childNodes:
        if child.nodeType == child.ELEMENT_NODE:
            if 'Message'==child.tagName:
                parseMessage(child)
    print '}'

for child in dom.childNodes:

    if 'Namespace'==child.tagName:
        parseNamespace(child)

for node in messages:
    message_name = node.attributes['name'].value
    type_name = None
    for type in node.getElementsByTagName('Type'):
        type_name = type.attributes['name'].value
    print 'template<typename %s>'%type_name
    print 'size_t calculate_size(const test::%s<%s> &data)'%(message_name, type_name)
    print '{ return'
    print '+'.join(['::calculate_size(data.%s)'%field.attributes['name'].value for field in node.getElementsByTagName('Field')])
    print ';}'
于 2013-01-10T07:02:57.487 回答