コード例 #1
0
        public static string Serialize(Dictionary <int, Node> nodes)
        {
            HashSet <int> usedDefaults = GetUsedDefaults(nodes);
            StringBuilder sb           = new StringBuilder();
            bool          first        = true;

            foreach (var pair in nodes)
            {
                Node node = pair.Value;
                if (node is DefaultNode && !usedDefaults.Contains(node.NodeId))
                {
                    continue;
                }
                if (!first)
                {
                    sb.Append('#');
                }
                first = false;
                sb.Append(NodeCollector.ToID(node.GetType()));
                sb.Append('|');
                sb.Append(node.NodeId);
                sb.Append('|');
                ICustomSerialiser custom = node as ICustomSerialiser;
                if (custom != null)
                {
                    sb.Append(custom.Serialize());
                    continue;
                }
                sb.Append(PositionToString(node.Position));
                sb.Append('|');
                for (int i = 0; i < node.Inputs.Length; i++)
                {
                    if (i != 0)
                    {
                        sb.Append(' ');
                    }
                    sb.Append(node.Inputs[i].NodeId);
                }
                sb.Append('|');

                FieldInfo[] fields = node.GetType().GetFields(BindingFlags.Public | BindingFlags.Instance);
                for (int i = 0; i < fields.Length; i++)
                {
                    if ((fields[i].Attributes & FieldAttributes.NotSerialized) != 0)
                    {
                        continue;
                    }
                    if (Exeptions.Contains(fields[i].Name))
                    {
                        continue;
                    }
                    if (i != 0)
                    {
                        sb.Append('|');
                    }
                    sb.Append(SerializeField(fields[i], node));
                }
            }
            return(sb.ToString());
        }
コード例 #2
0
        public static void Deserialize(string data, NodeData nodeData, Dictionary <int, Node> nodes)
        {
            nodes.Clear();
            string[] nodeStrings = data.Split('#');
            if (nodeStrings.Length < 2)
            {
                return;
            }
            for (int n = 0; n < nodeStrings.Length; n++)
            {
                string[] lines = nodeStrings[n].Split('|');

                Node node = nodeData.CreateNode(lines[0], int.Parse(lines[1]));
                if (node == null)
                {
                    continue;
                }
                ICustomSerialiser custom = node as ICustomSerialiser;
                if (custom != null)
                {
                    custom.Deserialize(lines);
                    continue;
                }

                node.Position = StringToPosition(lines[2]);

                FillInputs(ref node.Inputs, lines[3]);

                FieldInfo[] fields = node.GetType().GetFields(BindingFlags.Public | BindingFlags.Instance);
                for (int i = 0, l = 4; i < fields.Length; i++)
                {
                    if ((fields[i].Attributes & FieldAttributes.NotSerialized) != 0)
                    {
                        continue;
                    }
                    if (Exeptions.Contains(fields[i].Name))
                    {
                        continue;
                    }

                    DeserializeField(fields[i], node, lines[l++]);
                }
            }
        }