private object ReadFieldVector(BigEndianReader reader, D2OFieldDefinition field, int vectorDimension) { int count = reader.ReadInt(); Type vectorType = field.FieldType; for (int i = 0; i < vectorDimension; i++) { vectorType = vectorType.GetGenericArguments()[0]; } if (!objectCreators.ContainsKey(vectorType)) { Func <object[], object> creator = CreateObjectBuilder(vectorType, new FieldInfo[0]); objectCreators.Add(vectorType, creator); } var result = objectCreators[vectorType](new object[0]) as IList; for (int i = 0; i < count; i++) { vectorDimension++; // i didn't found a way to have thez correct dimension so i just add "- 1" result.Add(ReadField(reader, field, field.VectorTypes[vectorDimension - 1].Item1, vectorDimension)); vectorDimension--; } return(result); }
private object ReadField(BigEndianReader reader, D2OFieldDefinition field, D2OFieldType typeId, int vectorDimension = 0) { switch (typeId) { case D2OFieldType.Int: return(ReadFieldInt(reader)); case D2OFieldType.Bool: return(ReadFieldBool(reader)); case D2OFieldType.String: return(ReadFieldUTF(reader)); case D2OFieldType.Double: return(ReadFieldDouble(reader)); case D2OFieldType.I18N: return(ReadFieldI18n(reader)); case D2OFieldType.UInt: return(ReadFieldUInt(reader)); case D2OFieldType.List: return(ReadFieldVector(reader, field, vectorDimension)); default: return(ReadFieldObject(reader)); } }
private void WriteFieldVector(BigEndianWriter writer, D2OFieldDefinition field, IList list, int vectorDimension) { writer.WriteInt(list.Count); for (int i = 0; i < list.Count; i++) { WriteField(writer, field, field.VectorTypes[vectorDimension], ++vectorDimension); } }
private void WriteField(BigEndianWriter writer, D2OFieldDefinition field, dynamic obj, int vectorDimension = 0) { switch (field.TypeId) { case D2OFieldType.Int: WriteFieldInt(writer, (int)obj); break; case D2OFieldType.Bool: WriteFieldBool(writer, obj); break; case D2OFieldType.String: WriteFieldUTF(writer, obj); break; case D2OFieldType.Double: WriteFieldDouble(writer, obj); break; case D2OFieldType.I18N: WriteFieldI18n(writer, obj); break; case D2OFieldType.UInt: WriteFieldUInt(writer, (uint)obj); break; case D2OFieldType.List: WriteFieldVector(writer, field, obj, vectorDimension); break; default: WriteFieldObject(writer, obj); break; } }