BSON编码C#double [] []会产生一个Dictionary <string,double []> in python </string,double []>

时间:2013-05-28 19:28:14

标签: c# python json.net bson

我在旧邮件中搜索了答案,所以如果这是多余的,我会道歉。我还应该说我是一个蟒蛇新手。

我有一个C#应用程序正在使用Newtonsoft的BSON编码器来编码XYZ坐标的双[] [](每个点有三个坐标,例如点'0'的'x'坐标是数组[0] [0] ,第2点的'y'坐标是数组[2] [1])。然后使用ZeroMQ通过网络将这些坐标发送到python客户端。然后使用PyMongo BSON模块(https://github.com/mongodb/mongo-python-driver)解码BSON数据。

我将结构化数据传递给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]

因此,总而言之,我想要一个double [] []到达python但是字典到达了。我做错了什么?

我使用来自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是双[] []。

这是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 \吨@ \ 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'

有什么想法吗?我是否需要设置一些标志来告诉编码器不使用字符串字典?我正在尝试快速传输数据,所以我希望数据尽可能以最快,最少解释的形式出现,因此我希望不必一直将整数转换为字符串。

谢谢你的帮助!

-denny -

更新: 好吧,这是一个解决方法。我将所有要传输的二进制数据包装在一个字典中并将其发送出去。字典只有一个条目(dict [“0”] = myData;)。然后我将它发送到python,在那里我从第一个(也是唯一的)密钥中提取值,然后将其传递给那些对我的小包装技巧更聪明的调用者。像魅力一样,但它让我感到有点怪异。如果有人有更清洁,更正确的解决方案,我很乐意听到。

0 个答案:

没有答案