我正在尝试通过MQTT发送Microsoft的Kinect v2正文数据,以便在不直接连接到Kinect的情况下有效地映射骨架数据,但我似乎无法正确地反序列化Body []。我在Update()中每帧发布一个Bodys列表。
我目前的设置是使用Newtonsoft的JSON.Net来序列化从Body []获取的List并将其发布到MQTT(使用https://github.com/vovacooper/Unity3d_MQTT)。我使用过这个,因为Body类不可序列化(所以我不能使用JSONUtility?)。
基本上我有:
void Update() {
...
//trackedBodies is a List<Body> that contains the tracked Bodys
//client is MQTTClient that is connected
string bodyData = JsonConvert.SerializeObject(trackedBodies);
client.Publish("test", System.Text.Encoding.UTF8.GetBytes(bodyData));
...
}
和
void client_MqttMsgPublishReceived(object sender, MqttMsgPublishEventArgs e) {
//Check MQTT for data, then deserialize
List<Body> bodyData = JsonConvert.DeserializeObject<List<Body>>(System.Text.Encoding.UTF8.GetString(e.Message));
Debug.Log(bodyData);
}
当List为空时,我能够收到一个空的Bodys列表。当它是非空的时,代码会停止该方法,我根本无法再接收消息。 Update()方法仍然可以正常工作。
如果有人知道如何帮助我现有的东西,或者建议更好地替代我的问题,我将不胜感激。
答案 0 :(得分:2)
转换为JSON的数据可能太多了。也许你应该1)寻找替代的JSON库或2)自己解码和编码对象,只传输你需要的数据。
类似的东西:
void Update() {
...
//trackedBodies is a List<Body> that contains the tracked Bodys
//client is MQTTClient that is connected
string bodyData;
foreach(Body body: trackedBodies)
bodyData += "|" + body.X + ";" + body.Y + ";" + body.Z;
client.Publish("test", System.Text.Encoding.UTF8.GetBytes(bodyData));
...
}
另请看这里:https://www.newtonsoft.com/json/help/html/Performance.htm#ManuallySerialize
请问您可以在trackedBodies
内查看哪种数据?
答案 1 :(得分:0)
我看到有些人也可能有同样的问题。我终于为自己找到了一个有效的解决方案。我个人刚刚通过创建一个自定义的'伪'类来暴露Body对象来表示正文并保持Joint和JointOrientation数组。我能够通过MQTT通过使用Json.NET序列化来发送这些自定义对象的列表。
干杯。