8


http://msdn.microsoft.com/en-us/devlabs/hh975426.aspxでアクターについて読んでいる ときに、シリアル化に関する部分に気付きました。

シリアライゼーションはプログラムの正しい機能にとって重要であり、誤りが起こりやすいため、C++ アクター ライブラリには単純なメッセージ定義生成ツール 'msgtool' が含まれています。このツールは、指定された XML ドキュメントから必要な型とシリアライゼーションの定義を作成します。

VS コマンド プロンプトまたは Google 検索で msgtool が見つかりません。

4

2 に答える 2

6

これは、マイクロソフトのインキュベーション プロジェクトであり、DevLabs グループが所有するカサブランカ プロジェクトの一部です。これはかなり新鮮なプロジェクトで、最初に聞いたのは約 3 か月前でした。もっと長く続いていたのかもしれませんが、確かではありません。

標準の VS ディストリビューションにカサブランカ ツールは含まれていません。このプロジェクトは、Microsoft のコア シュリンク ラップ製品とはほど遠いものです。インキュベーション プロジェクトは、いつか成果をもたらす可能性のある有望なテクノロジを探索するための手段です。マイクロソフトは、取り組んでいることを公開することをためらうことはなく、顧客からフィードバックを得て、何が機能し、何が機能しないかを見つけています。「電話のアンテナに指を置かないでください」という驚きはありません。

彼らは間違いなくクラウド コンピューティングの主要なトレンドに逆らい、ネイティブ C++ を使用しています。これは非常に長い間 VM 言語の領域にありました。リフレクションのサポートは非​​常に重要な資産です。しかし、明らかに、これを機能させるには、C++ オブジェクトを確実にシリアライズすることが主要な要件であることがかなり重要です。したがって、この「msgtool」。

プロジェクトのランディングページはこちらです。VS2010、VS2012、および最新の Express エディションのインストーラーを提供しています。右側のボタンをクリックして開始します。実際に試したわけではありませんが、インストール後は「msgtool.exe」になるはずです。コミットした後に失敗するプロジェクトに対処できることを確認してください。これは、Microsoft でのこの種のプロジェクトの最も典型的な結果です。


更新: リンクされた Web ページは、DevLabs サイトでは利用できなくなったことに注意してください。真のプロジェクトのホームページには次のように記載されています。

ドキュメントは、DevLabs Web サイトでは利用できなくなりました。ダウンロードしたファイルでのみ利用できます。

リンク先のページのコピーは、Casablanca_Samples.zip\Documents\actors.html にあります。「シリアル化」セクションに移動し、2 つを比較します。msg_ptr<T>「msgtool」が言及されている正確な場所で、テンプレート クラスについて話していることがわかります。はい、確かに、このツールはサポートされていないか、現在の 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 に答える