C#Unity:JsonUtility序列化嵌套混合变量
我有一门课:C#Unity:JsonUtility序列化嵌套混合变量,c#,json,unity3d,C#,Json,Unity3d,我有一门课: using System; [Serializable] public class GameMessage { public string cmd; public object data; public string seedId; public string peerId; public GameMessage( string cmd, object data, string seedId = null, string peerId =
using System;
[Serializable]
public class GameMessage
{
public string cmd;
public object data;
public string seedId;
public string peerId;
public GameMessage( string cmd, object data, string seedId = null, string peerId = null )
{
this.cmd = cmd;
this.data = data;
this.seedId = seedId;
this.peerId = peerId;
}
}
在我调用的代码的某个地方:
JsonUtility.ToJson(new GameMessage("chat/say", "hello!"));
在这个操作之后,我在结果JSON中没有数据属性。
结果是:{“cmd”:“chat/say”、“seedId”:“peerId”:“}
怎么了?为什么数据不出现在最终的JSON结构中
数据
具有任何类型。(可能的字符串、自定义对象、浮点、数组等)
编辑:我正在为我的数据寻找一些序列化和反序列化的变通解决方案,因为
JsonUtility
不支持所有原始数据类型作为数据的根,只需要解析UnityEngine.Object
对象。所以JsonUtility不支持对象序列化。当您认为对象类型引用只是一个四字节的地址,而不知道对象的实际大小时,这是有意义的。因此序列化程序无法知道要序列化的数据是什么
您可以将字节[]转换为字符串64。该字符串可以由JsonUtility序列化。
下面是你的班级的样子:
[Serializable]
public class GameMessage
{
public string cmd;
public string data;
public string seedId;
public string peerId;
public byte [] Data{ get { return Encoding.ASCII.GetBytes(this.data); } }
public GameMessage( string cmd, byte[] data, string seedId = null, string peerId = null )
{
this.cmd = cmd;
this.data = Convert.BaseToString64(data);
this.seedId = seedId;
this.peerId = peerId;
}
}
下面是如何使用类ctor,考虑到任何类型都可以是数据,可以使用此方法():
现在假设你有一个值为5.12f的浮点
float f = 5.12f;
GameMessage gm = new GameMessage("chat/say", ObjectToByteArray((object)f));
string json = JsonUtility.ToJson(gm);
现在您要检索它:
var gm = JsonUtility.FromJson<GameMessage> (json);
byte[] array = gm.Data;
object f = ByteArrayToObject (array);
Debug.Log (f);
这会告诉你它到底是什么。使用类型引用进行强制转换没有简单的方法。你必须经历反射或动态
C#是一种强类型语言(与Javascript或Php等语言相反,在这些语言中,可以通过某种方式切换变量的类型)。由于这个原因,当您最终处于欢迎任何给定类型的情况时,这不是一个好的设计,并且会导致问题或大量代码,难以维护。您可能应该限制这些可能性。通过使用Unity
Newtonsoft.Json
库解决。尝试将数据作为字符串。转换为字节数组,然后转换为字符串,但如何反序列化byte[]
数据类型?如果可能的话,请提供你的回答片段我的坏我编辑了评论。它应该是字符串。字符串不正常,因为JsonUtility
无法将字符串反序列化为数组,例如。。。我尝试了“数据有任何类型(可能是字符串、自定义对象、浮点、数组等)”JsonUtility
无法序列化/反序列化对象
类型。您必须给出该对象的类型。但是我在后端有Node.js,它还应该读取序列化的base64字符串。我想它不会起作用。。。
var gm = JsonUtility.FromJson<GameMessage> (json);
byte[] array = gm.Data;
object f = ByteArrayToObject (array);
Debug.Log (f);
f.GetType();