internal static void LocalInitialize() { var listType = typeof(List <object>); var itemsMember = listType.GetField("_items", BindingFlags.Instance | BindingFlags.NonPublic); var sizeMember = listType.GetField("_size", BindingFlags.Instance | BindingFlags.NonPublic); _itemsFieldOffset = UnsafeUtils.GetFieldOffset(itemsMember); _sizeFieldOffset = UnsafeUtils.GetFieldOffset(sizeMember); }
public static FieldData[] GetFields(Type type, USerializer uSerializer, bool initializeDataSerializer = true) { var bindingFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; using (var fieldsIterator = new TypeFieldsIterator(8)) { var size = fieldsIterator.Fill(type, bindingFlags); var fields = new FieldData[size]; var index = 0; for (var i = 0; i < size; i++) { var fieldInfo = fieldsIterator[i]; if (uSerializer.SerializationPolicy.ShouldSerialize(fieldInfo) == false) { continue; } if (uSerializer.TryGetDataSerializer(fieldInfo.FieldType, out var serializationMethods, initializeDataSerializer) == false) { continue; } if (serializationMethods == null) { throw new Exception($"Returned null serializer for {fieldInfo.FieldType}"); } var fieldOffset = UnsafeUtils.GetFieldOffset(fieldInfo); if (fieldOffset > short.MaxValue) { throw new Exception("Field offset way to big!"); } var alternateNames = uSerializer.SerializationPolicy.GetAlternateNames(fieldInfo); fields[index] = new FieldData(fieldInfo.Name, alternateNames, serializationMethods, (ushort)fieldOffset); index++; } if (index != fields.Length) { Array.Resize(ref fields, index); } OrderFields(fields); return(fields); } }
public ClassFieldWriter(DataSerializer dataSerializer, FieldInfo fieldInfo) { if (dataSerializer == null) { throw new ArgumentNullException(nameof(dataSerializer)); } if (fieldInfo == null) { throw new ArgumentNullException(nameof(fieldInfo)); } if (fieldInfo.DeclaringType.IsClass == false) { throw new ArgumentException(nameof(fieldInfo)); } _fieldOffset = UnsafeUtils.GetFieldOffset(fieldInfo); _dataSerializer = dataSerializer; }
public StructFieldWriter(DataSerializer dataSerializer, FieldInfo fieldInfo) { _fieldOffset = UnsafeUtils.GetFieldOffset(fieldInfo); _dataSerializer = dataSerializer; }