Estoy buscando cómo guardar la variable que se definió como clase base en json.
[Serializable] class DataFile { public Node root; public void Save() { ParentNode root = new ParentNode(); root.m_Childs = new Node[2](); root.m_Name = "Root"; ParentNode node0 = new ParentNode(); ParentNode node1 = new ParentNode(); node0.m_Name = "Node0"; node1.m_Name = "Node1"; root.m_Childs[0] = node0; root.m_Childs[1] = node1; JSonUtility.ToJson(this); } } [Serializable] class Node { public string m_Name; } [Serializable] class ParentNode : Node { public Node[] m_Childs; } El JsonUtility resultante con el código anterior solo almacena m_Name de root y m_Childs no.
¿Cómo puedo averiguarlo?
Cuando serializas, estás serializando el valor de
public Node root;que solo tiene un
public string m_Name;no la variable local
ParentNode root = new ParentNode(); Además, el (des) serializador utilizará el tipo que le proporcione, no el tipo que podría ser por herencia. El único tipo conocido por DataFile es Node , por lo que solo serializará campos conocidos por ese tipo. Y el único tipo conocido por ParentNode son los hijos de tipo Node . Si necesita almacenar la información contenida en un ParentNode , ¡tendrá que usar campos de ese tipo en su lugar!
Supongo que tal vez debería ser más bien
[Serializable] class DataFile { public ParentNode root; public void Save() { var node0 = new ParentNode{ m_Name = "Node0" }; var node1 = new ParentNode{ m_Name = "Node1" }; root = new ParentNode{ m_Name = "Root", m_Childs = new[]{node0, node1} }; JSonUtility.ToJson(this); } } [Serializable] class Node { public string m_Name; } [Serializable] class ParentNode : Node { // Again the only type known to ParentNode is childs of type Node // if you need ParentNode then the type has to be that also in the // ParentNode class public ParentNode[] m_Childs; }Al igual que con otras bibliotecas json, la utilidad Json, que Unity proporciona de manera predeterminada, no pudo determinar qué tipo de contenido se almacenó cuando se cargó desde json. Decidí usar un objeto programable, pero si realmente desea usar Json Utility, puede usar ISerializationCallbackReceiver para hacer comandos antes y después de la serialización de Json.