2017-09-19 96 views
0

我有一个类:C#统一:JsonUtility序列化嵌套的混合变种

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结构中。

data任何类型。 (可能的字符串,自定义对象,浮动,阵列等)

编辑:我在寻找我的序列化和反序列化数据的一些解决方法解决方案,因为JsonUtility并不支持所有的原始数据类型为数据根,只需要解析UnityEngine.Object对象。

+0

请尝试将您的数据改为字符串。转换为字节数组,然后转换为字符串 – Everts

+0

,但如何反序列化byte []数据类型?如果它可能是请提供您的答案片段 – featureoffuture

+0

我不好,我编辑了评论。它应该是字符串。 – Everts

回答

1

所以JSONUtility不支持对象序列化。当你认为一个对象类型引用只是一个四字节地址而不知道该对象的实际大小时是有意义的。所以串行器无法知道要序列化的数据是什么。

你可以把你的byte []变成一个string64。该字符串可以被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; 
    } 
} 

这里是你如何使用类构造函数,考虑任何类型可以是数据,你可以用这个方法(Convert any object to a byte[]):

byte[] ObjectToByteArray(object obj) 
byte[] ObjectToByteArray(object obj) 
{ 
    if(obj == null) 
     return null; 
    BinaryFormatter bf = new BinaryFormatter(); 
    using (MemoryStream ms = new MemoryStream()) 
    { 
     bf.Serialize(ms, obj); 
     return ms.ToArray(); 
    } 
} 
object ByteArrayToObject(byte[] buffer) 
{ 
    MemoryStream ms = new MemoryStream (buffer); 
    BinaryFormatter bf = new BinaryFormatter(); 
    return bf.Deserialize (ms); 
} 

现在假设你有一个浮动值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); 

返回项目是对象类型。如果你需要知道它的类型(因为你说这可以是任何类型,你可能想知道这是什么序列化之前),只需使用:

f.GetType(); 

这会告诉你,它实际上是什么。使用Type引用没有简单的方法。你必须经历反思或动态。

C#是一种强类型语言(与Javascript或Php等语言相反,您可以通过某种方式切换变量的类型)。出于这个原因,当你喜欢你的情况时,欢迎任何给定的类型,这不是一个好的设计,会导致问题或庞大的代码,难以维护。你应该限制可能性。

+0

但我在后端有Node.js,它也应该读取序列化的base64字符串。我猜这是行不通的... – featureoffuture