public T CreateItem <T>(string id) where T : class, new() { TypeReadResult init = tagMap.Get(id); if (init == null) { return(null); } if (!init.type.IsAssignableFrom(typeof(T))) { return(null); } T retn = GetInstance(init) as T; for (int i = 0; i < toClear.Count; i++) { IEntityDeserializable d = toClear[i].instance as IEntityDeserializable; if (d != null) { d.AfterDeserialize(); } toClear[i].instance = null; } toClear.Clear(); return(retn); }
public T DeserializeInto <T>(string id, T instance) where T : class { TypeReadResult init = tagMap.Get(id); //temporarily swap ref id to point at instance, be sure to put it back //for the next call to CreateItem or it will crash if (init == null) { return(null); } init.instance = instance; context = init; TypeReadResult currentContext = context; SerializerUtil.GetTypeSerializer(init.type).Deserialize(instance, this); init.instance = instance; context = currentContext; toClear.Add(init); for (int i = 0; i < toClear.Count; i++) { IEntityDeserializable d = toClear[i].instance as IEntityDeserializable; if (d != null) { d.AfterDeserialize(); } toClear[i].instance = null; } toClear.Clear(); return(instance); }
private void ReadTypeFieldLine(string line) { TypeReadResult result = resultMap[line]; for (int i = 0; i < result.fields.Length; i++) { currentIdx++; result.fields[i] = ReadFieldLine(lines[currentIdx]); } }
private void ReadRefLine(string line) { string[] segments = line.Split(SpaceArray, 6); TypeReadResult result = new TypeReadResult(); result.refId = segments[0]; result.creationMethod = segments[1]; result.type = typeMap.Get(segments[5]); result.version = segments[4]; result.uuid = segments[2]; result.fields = new FieldReadResult[int.Parse(segments[3])]; resultMap[result.refId] = result; }
private void ReadStructLine(string line) { string[] segments = line.Split(SpaceArray); TypeReadResult result = new TypeReadResult(); result.structId = segments[0]; result.type = typeMap.Get(segments[5]); result.fields = new FieldReadResult[int.Parse(segments[3])]; for (int i = 0; i < result.fields.Length; i++) { currentIdx++; result.fields[i] = ReadFieldLine(lines[currentIdx]); } structMap.Add(result.structId, result); }
private object GetInstance(TypeReadResult result) { if (result.instance == null) { //todo - struct TypeReadResult currentContext = context; object retn; if (result.type == null) { return(null); } if (result.type.IsArray) { //todo save this object [] and just set [0] = fieldCount retn = Activator.CreateInstance(result.type, new object[] { result.fields.Length }); } else if (result.type.GetCustomAttributes(typeof(EntityDeserializerSkipConstructor), false).Length > 0) { retn = FormatterServices.GetUninitializedObject(result.type); } else { try { retn = Activator.CreateInstance(result.type); } catch (MissingMethodException) { retn = FormatterServices.GetUninitializedObject(result.type); } } result.instance = retn; context = result; SerializerUtil.GetTypeSerializer(result.type).Deserialize(retn, this); result.instance = retn; context = currentContext; toClear.Add(result); } return(result.instance); }