1

Flashを使用せずにAdobeFlashMedia Serverリモート共有オブジェクト(FSOファイル)を直接読み書きするにはどうすればよいですか?

できれば、python、php、またはjavaを使用したいのですが、別のコーディング言語を使用してもかまいません。ファイルの構造を探しているので、ファイルの読み取りと書き込みを行うこのアプリのように、ファイルの読み取りと書き込みを行うことがsolできます。

これが必要な理由は、1台のマシンで作成されたファイルを修正して、セットアップする新しいマシンに適切な設定ができるようにするためです。

ありがとう!

編集

メモ帳を使用してファイルの内容の一部を読み取ることはできますが、一部の文字が正しく表示されません。たとえば、http://pastebin.com/AWdJ2ZcRを確認してください。

16進エディタからの添付出力: ここに画像の説明を入力してください

私はpyamf運がなくてを使ってみました:

from pyamf import sol
lso = sol.load(file)

次のエラーが発生しました:

raise pyamf.DecodeError('Unknown SOL version in header')
pyamf.DecodeError: Unknown SOL version in header
4

1 に答える 1

3

これらのファイルはAMF形式を使用しており、実際には読み取りと書き込みが非常に簡単です。Pythonにはpyamfライブラリがあります。Javaには3や4のようなものがたくさんありますが、最も一般的に使用される2つは、Granite Data Servicesの一部であり、もう1つはAdobeによって以前に開発されたBlazeDataServicesです。PHPにもいくつかの実装があり、AMFPHPは歴史的に最初であり、次にフォークされ、メインの開発ブランチがZend Frameworkにマージされましたが、AMFPHPプロジェクト自体はまだ存在し、作業中ですが、かなり遅いです。

ただし、知っておく必要のある特定の事項があります。

  1. AMFは必ずしも自己定義的ではありません。これは、任意のペイロードを送信するためのオプションが含まれていることを意味します。実際には、そのようなオプションはいくつかありますが、実際には関連していません。

    • 次のペイロードを「カスタム」として説明するタグタイプがあります。つまり、リーダーが理解できる場合と理解できない場合がある、読み取るバイトの長さのみを記録します。IExternalizableこれは、AS3での実装に対応しています。

    • シリアル化からフィールドを省略するオプションがあります。この場合、Flashで作成されたオブジェクトのインスタンスは、ファイルから解析するインスタンスとは異なります。これは、[Transient]メタデータの使用に対応します。

    • 誰でもAMFをラッパーとして使用することを選択できますが、実際のシリアル化は別の形式で行い、ByteArrayタイプに対応するタグのみを使用します。その場合、それはあなたにとって少し役に立ちます。

  2. AMF 3.0には「拡張機能」があります。興味深いことに、この形式のすべてのユーザーが意図的に拡張機能を使用しているわけではなく、偶然にそれらを発見することもあります。プレーヤーの実装には、少なくともクラス用の特別なタグタイプがVectorありDictionaryますが、これらはフォーマット仕様の一部ではありません。ほとんどの読者は、これらのタグに遭遇したときにこれらのタグを理解していません。

  3. 仕様の一部ではない特定のクラスは、Flexフレームワークで一般的に使用されているため、歴史的にリーダーの実装の周りに保持されてきました。これらはArrayCollectionRemoteMessageそして他のいくつかです。ArrayCollection基本的にはと同じであるため、特に重要ですがArray、「カスタム」シリアル化タグとともに送信されます。

  4. ECMAScript配列の性質と動作を理解することも重要です。これらは、デコード時にサーバー障害の原因となる可能性があります。ECMAScript配列はスパースです。つまり、0から最大のインデックスまでのすべてのインデックスが含まれている必要はなく、配列(0から始まるインデックスの最初の連続ブロック)が混在しており、残りはハッシュテーブルとしてエンコードされます。整数キー。したがって、2 ^ 31の長さの配列をシリアル化できる可能性がありますが、この配列を実際の配列として解釈する場合、サーバー側でこれだけのメモリを割り当てることができません。

于 2012-08-02T17:27:36.227 に答える