Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#Unity:JsonUtility序列化嵌套混合变量_C#_Json_Unity3d - Fatal编程技术网

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();