Example #1
0
    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);
    }
Example #3
0
    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]);
        }
    }
Example #4
0
    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;
    }
Example #5
0
    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);
    }
Example #6
0
    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);
    }