From ab15a2c7039a81662b01bfafe8cb96fe251a20c3 Mon Sep 17 00:00:00 2001
From: Betim Beja <11160171+BetimBeja@users.noreply.github.com>
Date: Wed, 20 Apr 2022 06:40:22 +0200
Subject: [PATCH] :bug: Added missing IntegerConverter
---
XrmEntitySerializer.Tests/EntityTests.cs | 4 +-
XrmEntitySerializer.Version.props | 8 ++--
XrmEntitySerializer.props | 4 +-
XrmEntitySerializer/EntitySerializer.cs | 5 +++
XrmEntitySerializer/IntegerConverter.cs | 42 +++++++++++++++++++
XrmEntitySerializer/ValueTypeConverter.cs | 5 +++
.../XrmEntitySerializer.projitems | 1 +
7 files changed, 62 insertions(+), 7 deletions(-)
create mode 100644 XrmEntitySerializer/IntegerConverter.cs
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 @@
+