/// <summary> /// Deserialize the given data into a <see cref="BehaviorStream{T}"/>. /// </summary> /// <param name="blackboard">the <see cref="IBlackboard"/> the deserialized tree will use</param> /// <param name="data">the data to load from</param> /// <returns>the deserialized tree</returns> /// <exception cref="SerializationException">if the data fails to deserialize</exception> public BehaviorStream <T> Deserialize(T blackboard, string data) { int size; int growBy; ushort id; var deserializer = new YamlFluentDeserializer(data) .Read("Size", out size) .Read("GrowBy", out growBy) .Read("RootId", out id); BehaviorStream <T> result = new BehaviorStream <T>(blackboard, size, growBy) { Root = new TaskId(id) }; IDictionary <int, string> typeMap = new Dictionary <int, string>(); deserializer.BeginRead(); for (var i = 0; i < size; i++) { string typeName; deserializer.Read(i, out typeName); typeMap.Add(i, typeName); } deserializer.EndRead(); deserializer.BeginRead(); for (var i = 0; i < size; i++) { if (string.IsNullOrEmpty(typeMap[i])) { continue; } Type type = Type.GetType(typeMap[i]); if (type == null) { throw new SerializationException("Could not get type information for " + typeMap[i]); } Task <T> task = (Task <T>)Activator.CreateInstance(type); if (task == null) { throw new SerializationException("Could not create task from type " + type.AssemblyQualifiedName); } deserializer.Read(i, task); result.stream[i] = task; } deserializer.EndRead(); return(result); }
public virtual void Deserialize(YamlFluentDeserializer deserializer) { deserializer.BeginRead(); ushort id; deserializer.Read("Id", out id); this.Id = new TaskId(id); deserializer.Read("Guard", out id); this.Guard = new TaskId(id); deserializer.EndRead(); }