diff --git a/XrmEntitySerializer.Tests/EntityTests.cs b/XrmEntitySerializer.Tests/EntityTests.cs index 270afe2..8def83a 100644 --- a/XrmEntitySerializer.Tests/EntityTests.cs +++ b/XrmEntitySerializer.Tests/EntityTests.cs @@ -185,6 +185,8 @@ public void EarlyBoundEntityCanBeSerializedAndDeserialized() entityReference.Name = "Primary Contact"; entity.PrimaryContactId = entityReference; entity.FormattedValues.Add("primarycontactid", entityReference.Name); + entity.NumberOfEmployees = 1; + #if !XRM_7 && !XRM_6 && !XRM_5 entity.KeyAttributes.Add("name", "Unique Account"); #endif @@ -208,7 +210,7 @@ public void EarlyBoundEntityCanBeSerializedAndDeserialized() Assert.Equal(entity.LogicalName, deserializedEntity.LogicalName); Assert.Equal(entity.Id, deserializedEntity.Id); Assert.Equal(entity.Attributes.Count, deserializedEntity.Attributes.Count); - + Assert.Equal(entity.NumberOfEmployees, deserializedEntity.NumberOfEmployees); #if !XRM_7 && !XRM_6 && !XRM_5 Assert.Equal(entity.KeyAttributes.Count, deserializedEntity.KeyAttributes.Count); #endif diff --git a/XrmEntitySerializer.Version.props b/XrmEntitySerializer.Version.props index 3ccd8f3..40a3b01 100644 --- a/XrmEntitySerializer.Version.props +++ b/XrmEntitySerializer.Version.props @@ -5,9 +5,9 @@ Betim Beja Betim Beja Betim Beja - 1.3.3 - 1.3.3 - 1.3.3.0 - 1.3.3.0 + 1.3.4 + 1.3.4 + 1.3.4.0 + 1.3.4.0 \ No newline at end of file diff --git a/XrmEntitySerializer.props b/XrmEntitySerializer.props index e308554..bd9251d 100644 --- a/XrmEntitySerializer.props +++ b/XrmEntitySerializer.props @@ -16,8 +16,8 @@ This library can serialize an Microsoft.Xrm.Sdk.Entity to Json and back using Newtonsoft.Json library. - - v1.3.3: - a. Fixed a bug with Early-Bound entities + - v1.3.4: + a. Added missing IntegerConverter diff --git a/XrmEntitySerializer/EntitySerializer.cs b/XrmEntitySerializer/EntitySerializer.cs index 9be706c..ff0642f 100644 --- a/XrmEntitySerializer/EntitySerializer.cs +++ b/XrmEntitySerializer/EntitySerializer.cs @@ -19,6 +19,7 @@ public EntitySerializer() : base() TypeNameHandling = TypeNameHandling.All; ContractResolver = new XrmContractResolver(); Converters.Add(new GuidConverter()); + Converters.Add(new IntegerConverter()); Converters.Add(new DecimalConverter()); Converters.Add(new OptionSetValueConverter()); Converters.Add(new AttributeCollectionConverter()); @@ -51,6 +52,10 @@ public EntitySerializer(IEnumerable converters) : base() { Converters.Add(new GuidConverter()); } + if (!converters.Any(x => x.CanConvert(typeof(int)))) + { + Converters.Add(new IntegerConverter()); + } if (!converters.Any(x => x.CanConvert(typeof(decimal)))) { Converters.Add(new DecimalConverter()); diff --git a/XrmEntitySerializer/IntegerConverter.cs b/XrmEntitySerializer/IntegerConverter.cs new file mode 100644 index 0000000..f2ff838 --- /dev/null +++ b/XrmEntitySerializer/IntegerConverter.cs @@ -0,0 +1,42 @@ +using System; +using System.Globalization; +using Newtonsoft.Json; + +namespace XrmEntitySerializer +{ + public class IntegerConverter : ValueTypeConverter + { + public override bool CanConvert(Type objectType) + { + return typeof(int) == objectType || typeof(int?) == objectType; + } + + public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + { + writer.WriteStartObject(); + writer.WritePropertyName("$type"); + writer.WriteValue(string.Format("{0}, {1}", value.GetType().FullName, value.GetType().Assembly.GetName().Name)); + writer.WritePropertyName("$value"); + writer.WriteValue(value.ToString()); + writer.WriteEndObject(); + } + + protected override object ReadValue(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + { + int result; + if (reader.TokenType == JsonToken.Null) + { + if (objectType != typeof(int?)) + { + throw new JsonSerializationException(String.Format(CultureInfo.InvariantCulture, "Cannot convert null value to {0}.", objectType)); + } + return default(int?); + } + else if (!int.TryParse(reader.Value.ToString(), out result)) + { + throw new JsonSerializationException(string.Format(CultureInfo.InvariantCulture, "Unexpected token or value when parsing Integer. Token: {0}, Value: {1}", reader.TokenType, reader.Value)); + } + return result; + } + } +} \ No newline at end of file diff --git a/XrmEntitySerializer/ValueTypeConverter.cs b/XrmEntitySerializer/ValueTypeConverter.cs index 65fc2d5..837443b 100644 --- a/XrmEntitySerializer/ValueTypeConverter.cs +++ b/XrmEntitySerializer/ValueTypeConverter.cs @@ -24,6 +24,11 @@ public override object ReadJson(JsonReader reader, Type objectType, object exist return ReadValue(reader, objectType, existingValue, serializer); } + if (reader.TokenType == JsonToken.Integer) + { + return ReadValue(reader, objectType, existingValue, serializer); + } + for (int i = 0; i < 2; i++) { reader.Read(); diff --git a/XrmEntitySerializer/XrmEntitySerializer.projitems b/XrmEntitySerializer/XrmEntitySerializer.projitems index eb35051..59db8a0 100644 --- a/XrmEntitySerializer/XrmEntitySerializer.projitems +++ b/XrmEntitySerializer/XrmEntitySerializer.projitems @@ -10,6 +10,7 @@ +