/// <summary> /// Determines the type name to write to the payload. Json Light type names are only written into the payload for open properties /// or if the payload type name is more derived than the model type name. /// </summary> /// <param name="value">The ODataValue whose type name is to be written.</param> /// <param name="typeReferenceFromMetadata">The type as expected by the model.</param> /// <param name="typeReferenceFromValue">The type resolved from the value.</param> /// <param name="isOpenProperty">true if the type name belongs to an open property, false otherwise.</param> /// <returns>Type name to write to the payload, or null if no type should be written.</returns> internal override string GetValueTypeNameForWriting( ODataValue value, IEdmTypeReference typeReferenceFromMetadata, IEdmTypeReference typeReferenceFromValue, bool isOpenProperty) { DebugUtils.CheckNoExternalCallers(); SerializationTypeNameAnnotation typeNameAnnotation = value.GetAnnotation <SerializationTypeNameAnnotation>(); if (typeNameAnnotation != null) { return(typeNameAnnotation.TypeName); } // Do not write type name when the type is native json type. if (typeReferenceFromValue != null && typeReferenceFromValue.IsPrimitive() && JsonSharedUtils.ValueTypeMatchesJsonType((ODataPrimitiveValue)value, typeReferenceFromValue.AsPrimitive())) { return(null); } return(GetTypeNameFromValue(value)); }
/// <summary> /// Determines the type name to write to the payload. Json Light type names are only written into the payload for open properties /// or if the payload type name is more derived than the model type name. /// </summary> /// <param name="value">The ODataValue whose type name is to be written.</param> /// <param name="typeReferenceFromMetadata">The type as expected by the model.</param> /// <param name="typeReferenceFromValue">The type resolved from the value.</param> /// <param name="isOpenProperty">true if the type name belongs to an open property, false otherwise.</param> /// <returns>Type name to write to the payload, or null if no type should be written.</returns> internal override string GetValueTypeNameForWriting( ODataValue value, IEdmTypeReference typeReferenceFromMetadata, IEdmTypeReference typeReferenceFromValue, bool isOpenProperty) { SerializationTypeNameAnnotation typeNameAnnotation = value.GetAnnotation <SerializationTypeNameAnnotation>(); if (typeNameAnnotation != null) { return(typeNameAnnotation.TypeName); } if (typeReferenceFromValue != null) { // Write type name when the type in the payload is more derived than the type from metadata. if (typeReferenceFromMetadata != null && typeReferenceFromMetadata.Definition.AsActualType().FullTypeName() != typeReferenceFromValue.FullName()) { return(typeReferenceFromValue.FullName()); } // Note: When writing derived complexType value in a payload, we don't have the expected type. // So always write @odata.type for top-level derived complex type. if (typeReferenceFromMetadata == null && typeReferenceFromValue.IsComplex()) { if ((typeReferenceFromValue as IEdmComplexTypeReference).ComplexDefinition().BaseType != null) { return(typeReferenceFromValue.FullName()); } } // Do not write type name when the type is native json type. if (typeReferenceFromValue.IsPrimitive() && JsonSharedUtils.ValueTypeMatchesJsonType((ODataPrimitiveValue)value, typeReferenceFromValue.AsPrimitive())) { return(null); } } if (!isOpenProperty) { // Do not write type name for non-open properties since we expect the reader to have an expected type (via API or context URI) and thus not need it. return(null); } return(GetTypeNameFromValue(value)); }
/// <summary> /// Determines the type name to write to the payload. Json Light type names are only written into the payload for open properties /// or if the payload type name is more derived than the model type name. /// </summary> /// <param name="value">The ODataValue whose type name is to be written.</param> /// <param name="typeReferenceFromMetadata">The type as expected by the model.</param> /// <param name="typeReferenceFromValue">The type resolved from the value.</param> /// <param name="isOpenProperty">true if the type name belongs to an open property, false otherwise.</param> /// <returns>Type name to write to the payload, or null if no type should be written.</returns> internal override string GetValueTypeNameForWriting( ODataValue value, IEdmTypeReference typeReferenceFromMetadata, IEdmTypeReference typeReferenceFromValue, bool isOpenProperty) { SerializationTypeNameAnnotation typeNameAnnotation = value.GetAnnotation<SerializationTypeNameAnnotation>(); if (typeNameAnnotation != null) { return typeNameAnnotation.TypeName; } if (typeReferenceFromValue != null) { // Write type name when the type in the payload is more derived than the type from metadata. if (typeReferenceFromMetadata != null && typeReferenceFromMetadata.Definition.AsActualType().ODataFullName() != typeReferenceFromValue.ODataFullName()) { return typeReferenceFromValue.ODataFullName(); } // Note: When writing derived complexType value in a payload, we don't have the expected type. // So always write @odata.type for top-level derived complextype. if (typeReferenceFromMetadata == null && typeReferenceFromValue.IsComplex()) { if ((typeReferenceFromValue as IEdmComplexTypeReference).ComplexDefinition().BaseType != null) { return typeReferenceFromValue.ODataFullName(); } } // Do not write type name when the type is native json type. if (typeReferenceFromValue.IsPrimitive() && JsonSharedUtils.ValueTypeMatchesJsonType((ODataPrimitiveValue)value, typeReferenceFromValue.AsPrimitive())) { return null; } } if (!isOpenProperty) { // Do not write type name for non-open properties since we expect the reader to have an expected type (via API or context URI) and thus not need it. return null; } return GetTypeNameFromValue(value); }
/// <summary> /// Gets the metadata URI type name based on the given property. /// </summary> /// <param name="property">The property.</param> /// <returns>The type name for the metadata URI.</returns> private static string GetMetadataUriTypeNameForValue(ODataProperty property) { Debug.Assert(property != null, "property != null"); ODataValue value = property.ODataValue; Debug.Assert(value != null, "value != null"); // special identifier for null values. if (value.IsNullValue) { return(JsonLightConstants.MetadataUriFragmentNull); } var typeAnnotation = value.GetAnnotation <SerializationTypeNameAnnotation>(); if (typeAnnotation != null && !string.IsNullOrEmpty(typeAnnotation.TypeName)) { return(typeAnnotation.TypeName); } var complexValue = value as ODataComplexValue; if (complexValue != null) { return(complexValue.TypeName); } var collectionValue = value as ODataCollectionValue; if (collectionValue != null) { return(collectionValue.TypeName); } ODataPrimitiveValue primitive = value as ODataPrimitiveValue; if (primitive == null) { Debug.Assert(value is ODataStreamReferenceValue, "value is ODataStreamReferenceValue"); throw new ODataException(OData.Strings.ODataWriter_StreamPropertiesMustBePropertiesOfODataEntry(property.Name)); } return(EdmLibraryExtensions.GetPrimitiveTypeReference(primitive.Value.GetType()).ODataFullName()); }
/// <summary> /// Determines the type name to write to the payload. Json Light type names are only written into the payload for open properties /// or if the payload type name is more derived than the model type name. /// </summary> /// <param name="value">The ODataValue whose type name is to be written.</param> /// <param name="typeReferenceFromMetadata">The type as expected by the model.</param> /// <param name="typeReferenceFromValue">The type resolved from the value.</param> /// <param name="isOpenProperty">true if the type name belongs to an open property, false otherwise.</param> /// <returns>Type name to write to the payload, or null if no type should be written.</returns> internal override string GetValueTypeNameForWriting( ODataValue value, IEdmTypeReference typeReferenceFromMetadata, IEdmTypeReference typeReferenceFromValue, bool isOpenProperty) { SerializationTypeNameAnnotation typeNameAnnotation = value.GetAnnotation<SerializationTypeNameAnnotation>(); if (typeNameAnnotation != null) { return typeNameAnnotation.TypeName; } // Do not write type name when the type is native json type. if (typeReferenceFromValue != null && typeReferenceFromValue.IsPrimitive() && JsonSharedUtils.ValueTypeMatchesJsonType((ODataPrimitiveValue)value, typeReferenceFromValue.AsPrimitive())) { return null; } return GetTypeNameFromValue(value); }
/// <summary> /// Determines the type name to write to the payload. Json Light type names are only written into the payload for open properties /// or if the payload type name is more derived than the model type name. /// </summary> /// <param name="value">The ODataValue whose type name is to be written.</param> /// <param name="typeReferenceFromMetadata">The type as expected by the model.</param> /// <param name="typeReferenceFromValue">The type resolved from the value.</param> /// <param name="isOpenProperty">true if the type name belongs to an open property, false otherwise.</param> /// <returns>Type name to write to the payload, or null if no type should be written.</returns> internal override string GetValueTypeNameForWriting( ODataValue value, IEdmTypeReference typeReferenceFromMetadata, IEdmTypeReference typeReferenceFromValue, bool isOpenProperty) { DebugUtils.CheckNoExternalCallers(); SerializationTypeNameAnnotation typeNameAnnotation = value.GetAnnotation <SerializationTypeNameAnnotation>(); if (typeNameAnnotation != null) { return(typeNameAnnotation.TypeName); } if (typeReferenceFromValue != null) { // Write type name when the type in the payload is more derived than the type from metadata. if (typeReferenceFromMetadata != null && typeReferenceFromMetadata.ODataFullName() != typeReferenceFromValue.ODataFullName()) { return(typeReferenceFromValue.ODataFullName()); } // Do not write type name when the type is native json type. if (typeReferenceFromValue.IsPrimitive() && JsonSharedUtils.ValueTypeMatchesJsonType((ODataPrimitiveValue)value, typeReferenceFromValue.AsPrimitive())) { return(null); } } if (!isOpenProperty) { // Do not write type name for non-open properties since we expect the reader to have an expected type (via API or metadata URI) and thus not need it. return(null); } return(GetTypeNameFromValue(value)); }