古いメッセージで回答を検索したので、これが冗長である場合はお詫び申し上げます。また、私は Python の初心者です。
Newtonsoft の BSON エンコーダーを使用して XYZ 座標の double[][] をエンコードする C# アプリがあります (各ポイントには 3 つの座標があります。たとえば、ポイント '0' の 'x' 座標は配列 [0][0]、'点 2 の y' 座標は配列 [2][1]) です。これらの座標は、ZeroMQ を使用してネットワーク経由で Python クライアントに送信されます。BSON データは、PyMongo BSON モジュール ( https://github.com/mongodb/mongo-python-driver ) を使用してデコードされます。
構造化データを python に取得していますが、C# の double[][] は python で次のように表示されます
{u'1': [3.227, 0.0, 0.0], u'0': [4.081, 0.0, 0.0], u'2': [2.845, 0.0, 0.0]}
... 文字列と double[] の辞書。したがって、最初のインデックスは文字列として解釈されています。私が欲しい:
配列[0][2]
...しかし、表示されるデータ構造には次が必要です。
配列[u'0'][2]
つまり、要約すると、python に double[][] が到着するようにしたいのですが、代わりに Dictionary が到着しています。私は何を間違っていますか?
https://pypi.python.org/pypi/bson/0.3.2の BSON コーデックを使用してこの同じデータをデコードしたところ、まったく同じ結果が得られたので、何が起こっていても、少なくとも一貫性があります。
私のC#コードはこれです:
static public byte[] Encode<T>(object obj)
{
MemoryStream memstr = new MemoryStream();
using (BsonWriter writer = new BsonWriter(memstr))
{
JsonSerializer serializer = new JsonSerializer();
serializer.Serialize(writer, obj,typeof(T));
}
var retval = memstr.ToArray();
return retval;
}
そして、私はそれを次のように呼びます:
byte[] reply = Streamer.Encode<double[][]>(mCoords);
... mCoords は double[][] です。
これは、Python がネットワーク経由で受信するバイナリ データです。
'\x80\x00\x00\x00\x040\x00&\x00\x00\x00\x010\x00m\xe7\xfb\xa9\xf1R\x10@\x011\x00\x00\x00\x00\x00\x00\ x00\x00\x00\x012\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04 1\x00&\x00\x00\x00\x010\x007\x89A`\xe5\xd0 \t@\x011\x00\x00\x00\x00\x00\x00\x00\x0 0\x00\x012\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x042\ x00&\x00\x00\x00\x010\x00\xc3\xf5(\\x8f\xc2\x06@\x011\x00\x00\x00\x00\x00\x00\x00\x00\x00\x012\x00\ x00\x00\ x00\x00\x00\x00\x00\x00\x00\x00'
何か案は?文字列辞書を使用しないようにエンコーダーに指示するフラグを設定する必要がありますか? データをすばやくストリーミングしようとしているので、データをできるだけ高速で解釈の少ない形式で表示したいので、常に int を文字列に変換する必要がないようにしたいと考えています。
助けてくれてありがとう!
-デニー-
更新: さて、ここに回避策があります。転送したいすべてのバイナリ データを取得し、それを辞書にラップして送信します。ディクショナリには 1 つのエントリしかありません (dict["0"] = myData;)。次に、それを python に送り、そこで最初の (そして唯一の) キーから値を抽出し、それを呼び出し元にスタックに渡します。魔法のように機能しますが、少し奇妙に感じます。誰かがよりクリーンで正しい解決策を持っている場合は、ぜひ聞いてください。