/// <summary> /// Serializes a property. /// </summary> /// <param name="version"></param> /// <param name="context">The serialization context to use.</param> /// <param name="tagStream">The stream to write completed blocks of tag data to.</param> /// <param name="block">The temporary block to write incomplete tag data to.</param> /// <param name="instance">The object that the property belongs to.</param> /// <param name="tagFieldInfo">The field enumerator.</param> /// <param name="baseOffset">The base offset of the structure from the start of its block.</param> /// <exception cref="System.InvalidOperationException">Offset for property \ + property.Name + \ is outside of its structure</exception> private void SerializeProperty(CacheVersion version, ISerializationContext context, MemoryStream tagStream, IDataBlock block, object instance, TagFieldInfo tagFieldInfo, long baseOffset) { if (tagFieldInfo.Attribute.Flags.HasFlag(Runtime)) { return; } object objectValue = tagFieldInfo.GetValue(instance); // second condition is a hack to prevent exceptions when encountering cached tags if (objectValue != null) { if (objectValue.GetType() == tagFieldInfo.FieldType || tagFieldInfo.FieldType == typeof(CachedTag)) { SerializeValue(version, context, tagStream, block, objectValue, tagFieldInfo.Attribute, tagFieldInfo.FieldType); } else { throw new Exception($"TagFieldInfo.GetValue return type {objectValue.GetType().ToString()} is not the same as the FieldInfo Type {tagFieldInfo.FieldType.ToString()}!"); } } else { SerializeValue(version, context, tagStream, block, objectValue, tagFieldInfo.Attribute, tagFieldInfo.FieldType); } }
/// <summary> /// Serializes a property. /// </summary> /// <param name="version"></param> /// <param name="context">The serialization context to use.</param> /// <param name="tagStream">The stream to write completed blocks of tag data to.</param> /// <param name="block">The temporary block to write incomplete tag data to.</param> /// <param name="instance">The object that the property belongs to.</param> /// <param name="tagFieldInfo">The field enumerator.</param> /// <param name="baseOffset">The base offset of the structure from the start of its block.</param> /// <exception cref="System.InvalidOperationException">Offset for property \ + property.Name + \ is outside of its structure</exception> private void SerializeProperty(CacheVersion version, ISerializationContext context, MemoryStream tagStream, IDataBlock block, object instance, TagFieldInfo tagFieldInfo, long baseOffset) { if (tagFieldInfo.Attribute.Flags.HasFlag(TagFieldFlags.Runtime)) { return; } SerializeValue(version, context, tagStream, block, tagFieldInfo.GetValue(instance), tagFieldInfo.Attribute, tagFieldInfo.FieldType); }