/// <inheritdoc/> internal override void OnAddedToContentWriter(ContentWriter output) { base.OnAddedToContentWriter(output); _keyWriter = output.GetTypeWriter(typeof(K)); _valueWriter = output.GetTypeWriter(typeof(V)); }
/// <inheritdoc/> internal override void OnAddedToContentWriter(ContentWriter output) { base.OnAddedToContentWriter(output); foreach (var property in _properties) { output.GetTypeWriter(property.PropertyType); } foreach (var field in _fields) { output.GetTypeWriter(field.FieldType); } }
/// <inheritdoc/> internal override void OnAddedToContentWriter(ContentWriter output) { base.OnAddedToContentWriter(output); if (TargetType.IsGenericType) { _genericTypes = new List <ContentTypeWriter>(); var arguments = TargetType.GetGenericArguments(); foreach (var arg in arguments) { _genericTypes.Add(output.GetTypeWriter(arg)); } } }
protected internal override void Write(ContentWriter output, object value) { if (_baseType != null) { var baseTypeWriter = output.GetTypeWriter(_baseType); baseTypeWriter.Write(output, value); } foreach (var property in _properties) { Write(value, output, property); } foreach (var field in _fields) { Write(value, output, field); } }
private static void Write(object parent, ContentWriter output, MemberInfo member) { var property = member as PropertyInfo; var field = member as FieldInfo; Debug.Assert(field != null || property != null); Type elementType; object memberObject; if (property != null) { elementType = property.PropertyType; memberObject = property.GetValue(parent, null); } else { elementType = field.FieldType; memberObject = field.GetValue(parent); } if (_sharedResources.Contains(member)) { output.WriteSharedResource(memberObject); } else { var writer = output.GetTypeWriter(elementType); if (writer == null || elementType == typeof(object) || elementType == typeof(Array)) { output.WriteObject(memberObject); } else { output.WriteObject(memberObject, writer); } } }
protected internal override void Write(ContentWriter output, T value) { var typeWriter = output.GetTypeWriter(_underlyingType); output.WriteRawObject(Convert.ChangeType(value, _underlyingType), typeWriter); }
/// <inheritdoc/> internal override void OnAddedToContentWriter(ContentWriter output) { base.OnAddedToContentWriter(output); _underlyingType = Enum.GetUnderlyingType(typeof(T)); _underlyingTypeWriter = output.GetTypeWriter(_underlyingType); }
/// <inheritdoc/> internal override void OnAddedToContentWriter(ContentWriter output) { base.OnAddedToContentWriter(output); _elementWriter = output.GetTypeWriter(typeof(T)); }
private static void Write(object parent, ContentWriter output, MemberInfo member) { var property = member as PropertyInfo; var field = member as FieldInfo; Debug.Assert(field != null || property != null); // Properties must have public get and set if (property != null && (property.CanWrite == false || property.CanRead == false)) { return; } if (property != null && property.Name == "Item") { var getMethod = ReflectionHelpers.GetPropertyGetMethod(property); var setMethod = ReflectionHelpers.GetPropertySetMethod(property); if ((getMethod != null && getMethod.GetParameters().Length > 0) || (setMethod != null && setMethod.GetParameters().Length > 0)) { // This is presumably a property like this[indexer] and this // should not get involved in the object deserialization. return; } } var attr = ReflectionHelpers.GetCustomAttribute(member, typeof(ContentSerializerIgnoreAttribute)); if (attr != null) { return; } var contentSerializerAttribute = ReflectionHelpers.GetCustomAttribute(member, typeof(ContentSerializerAttribute)) as ContentSerializerAttribute; bool isSharedResource = false; if (contentSerializerAttribute != null) { isSharedResource = contentSerializerAttribute.SharedResource; } else { if (property != null) { if (!ReflectionHelpers.PropertyIsPublic(property)) { return; } } else { if (!field.IsPublic) { return; } // evolutional: Added check to skip initialise only fields if (field.IsInitOnly) { return; } } } ContentTypeWriter writer; Type elementType; object memberObject; if (property != null) { elementType = property.PropertyType; writer = output.GetTypeWriter(elementType); memberObject = property.GetValue(parent, null); } else { elementType = field.FieldType; writer = output.GetTypeWriter(elementType); memberObject = field.GetValue(parent); } if (!isSharedResource) { if (writer == null && elementType == typeof(object)) { // Write elements serialized as "object". output.WriteObject(memberObject); } else { // We can get here and still be NULL, exit gracefully. if (writer == null) { return; } output.WriteObject(memberObject, writer); } } else { output.WriteSharedResource(memberObject); } }
private static void Write(object parent, ContentWriter output, MemberInfo member) { var property = member as PropertyInfo; var field = member as FieldInfo; Debug.Assert(field != null || property != null); if (property != null) { // Properties must have at least a getter. if (property.CanRead == false) { return; } // Skip over indexer properties. if (property.Name == "Item") { var getMethod = ReflectionHelpers.GetPropertyGetMethod(property); var setMethod = ReflectionHelpers.GetPropertySetMethod(property); if ((getMethod != null && getMethod.GetParameters().Length > 0) || (setMethod != null && setMethod.GetParameters().Length > 0)) { return; } } } // Are we explicitly asked to ignore this item? if (ReflectionHelpers.GetCustomAttribute <ContentSerializerIgnoreAttribute>(member) != null) { return; } var contentSerializerAttribute = ReflectionHelpers.GetCustomAttribute <ContentSerializerAttribute>(member); if (contentSerializerAttribute == null) { if (property != null) { // There is no ContentSerializerAttribute, so non-public // properties cannot be serialized. if (!ReflectionHelpers.PropertyIsPublic(property)) { return; } // Check the type reader to see if it is safe to // deserialize into the existing type. if (!property.CanWrite && !output.CanDeserializeIntoExistingObject(property.PropertyType)) { return; } } else { // There is no ContentSerializerAttribute, so non-public // fields cannot be deserialized. if (!field.IsPublic) { return; } // evolutional: Added check to skip initialise only fields if (field.IsInitOnly) { return; } } } Type elementType; object memberObject; if (property != null) { elementType = property.PropertyType; memberObject = property.GetValue(parent, null); } else { elementType = field.FieldType; memberObject = field.GetValue(parent); } if (contentSerializerAttribute != null && contentSerializerAttribute.SharedResource) { output.WriteSharedResource(memberObject); } else { var writer = output.GetTypeWriter(elementType); if (writer == null || elementType == typeof(object) || elementType == typeof(Array)) { output.WriteObject(memberObject); } else { output.WriteObject(memberObject, writer); } } }