public object Unpack(Packer packer, System.Type rootType) { var instance = System.Activator.CreateInstance(rootType); var fields = rootType.GetCachedFields(); for (int i = 0; i < fields.Length; ++i) { var type = packer.ReadByte(); if (type == (byte)TypeValue.Null) { fields[i].SetValue(instance, null); continue; } if (packer.serializers.TryGetValue(type, out var ser) == true) { fields[i].SetValue(instance, ser.unpack.Invoke(packer)); } else { packer.UnpackInternal(); } } return(instance); }
public void PackInternal <T>(T root, System.Type rootType) { if (this.serializers.TryGetValue(rootType, out var serializer) == true) { this.WriteByte(serializer.typeValue); serializer.pack.Invoke(this, root); } else { if (rootType.IsPrimitive == true || rootType.IsArray == true) { Debug.LogError("Pack type has failed: " + rootType); return; } Debug.Log("GEN FIELDS"); var fields = rootType.GetCachedFields(); for (int i = 0; i < fields.Length; ++i) { var val = fields[i].GetValue(root); var type = fields[i].GetFieldType(); if (this.serializers.TryGetValue(type, out var ser) == true) { this.WriteByte(ser.typeValue); ser.pack.Invoke(this, val); } else { this.PackInternal(val); } } } }
public void Pack(Packer packer, object obj, System.Type rootType) { var fields = rootType.GetCachedFields(); for (int i = 0; i < fields.Length; ++i) { var val = fields[i].GetValue(obj); if (val == null) { packer.WriteByte((byte)TypeValue.Null); continue; } var type = fields[i].GetFieldType(); if (packer.serializers.TryGetValue(type, out var ser) == true) { packer.WriteByte(ser.typeValue); ser.pack.Invoke(packer, val); } else { packer.PackInternal(val); } } }