Visual Studio — Где взять мифический Microsoft msgtool для сериализации C ++

читая об актерах на
http://msdn.microsoft.com/en-us/devlabs/hh975426.aspx
Я заметил часть о сериализации:

Поскольку сериализация имеет решающее значение для правильной функции программы
и так легко ошибиться, библиотека C ++ Actors включает в себя
простой инструмент генерации определения сообщения, «msgtool», который дал
XML документ создаст необходимый тип и сериализацию
определение.

Я не могу найти msgtool в командной строке VS или с помощью поиска Google.

8

Решение

Это часть проекта Касабланки, инкубационный проект в Microsoft и принадлежит группе DevLabs. Это довольно свежий проект, впервые я услышал об этом около 3 месяцев назад. Возможно, это продолжалось дольше, не уверен.

Вы не найдете ни одного из инструментов Casablanca в стандартном дистрибутиве VS. Этот проект далек от того, чтобы быть основным продуктом Microsoft в термоусадочной упаковке. Инкубационные проекты являются средством для изучения перспективных технологий, которые когда-нибудь может окупиться Microsoft никогда не стеснялась рассказывать о том, над чем они работают, получать отзывы от своих клиентов, чтобы узнать, что работает, а что нет. Никаких сюрпризов «не кладите палец на антенну телефона».

Они определенно противодействуют основной тенденции в облачных вычислениях, они используют нативный C ++. Это было в области языков ВМ в течение очень долгого времени. Поддержка отражений является довольно важным активом. Но ясно, что для того, чтобы все это работало, довольно важно, чтобы надежная сериализация объектов C ++ была основным требованием. Таким образом, это «msgtool».

Целевая страница для проекта это здесь. Они предлагают инсталляторы для VS2010, VS2012 и новейших версий Express. Нажмите на кнопки справа, чтобы начать. Я на самом деле не пробовал, но после установки вы должны получить msgtool.exe. Убедитесь, что вы можете справиться с крахом проекта после его принятия, что является наиболее типичным результатом для подобных проектов в Microsoft.


ОБНОВЛЕНИЕ: обратите внимание, что связанная веб-страница больше не доступна на сайте DevLabs. Настоящий проект домашняя страница отмечает:

Наша документация больше не доступна на веб-сайте DevLabs, только в загруженных файлах

Вы можете найти копию связанной страницы в Casablanca_Samples.zip \ Documents \ актеры.html. Перейдите в раздел «Сериализация» и сравните их. В том месте, где упоминается «msgtool», вы увидите, что он говорит о msg_ptr<T> шаблон класса. Так что да, похоже, этот инструмент больше не поддерживается или не включен в текущий SDK, если он когда-либо был.

6

Другие решения

Вот, пожалуйста, на питоне — быстро и грязно! И неправильно, конечно, но вы поняли, я надеюсь!

import xml.dom.minidoms = '''
<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 ';}'
1