Skip to content

Instantly share code, notes, and snippets.

@wahidshalaly
Created October 19, 2011 15:31
Show Gist options
  • Save wahidshalaly/1298642 to your computer and use it in GitHub Desktop.
Save wahidshalaly/1298642 to your computer and use it in GitHub Desktop.
First, I thought, unluckily, I hit a bug on Json.NET while serializing enum but after testing the issue I found out that it seems something by design but I could not find it documented. So, here you are, tests I wrote to study the issue.
//#define UsingStringEnumConverter
using System;
#if UsingStringEnumConverter
using Newtonsoft.Json.Converters;
#endif
using NUnit.Framework;
namespace Newtonsoft.Json.Tests.Converters
{
class ReadOnlyPropertiesIssue
{
static class TestHelper
{
public static void AssertCanSerialize<T>(T toSerialize, string expectedJson)
where T : ITestObject, IEquatable<T>
{
#if UsingStringEnumConverter
string json = JsonConvert.SerializeObject(toSerialize, Formatting.Indented, new StringEnumConverter());
#else
string json = JsonConvert.SerializeObject(toSerialize, Formatting.Indented);
#endif
Console.WriteLine("Expected: {0} \r\nActual: {1}", expectedJson, json);
Assert.AreEqual(expectedJson, json);
}
public static void AssertCanDeserialize<T>(string toDeserialize, T expectedObject)
where T : ITestObject, IEquatable<T>
{
var obj = JsonConvert.DeserializeObject<T>(toDeserialize);
Console.WriteLine("Expected: [{0}, \"{1}\", \"{2}\"]", expectedObject.UserID, expectedObject.UserName, expectedObject.UserRole);
Console.WriteLine("Actual: [{0}, \"{1}\", \"{2}\"]", obj.UserID, obj.UserName, obj.UserRole);
Assert.IsTrue(expectedObject.Equals(obj));
}
}
public enum UserRoles { Admin = 101, User = 102, Guest = 501 }
private const int USER_ID = 1001;
private const string USER_NAME = "Waheed Sayed";
private const UserRoles USER_ROLE = UserRoles.Guest;
#if UsingStringEnumConverter
private const string USER_IN_JSON = @"{
""UserID"": 1001,
""UserName"": ""Waheed Sayed"",
""UserRole"": ""Guest""
}";
#else
private const string USER_IN_JSON = @"{
""UserID"": 1001,
""UserName"": ""Waheed Sayed"",
""UserRole"": 501
}";
#endif
#region Cases to be tested
public interface ITestObject
{
int UserID { get; }
string UserName { get; }
UserRoles UserRole { get; }
}
public class ReadWritePropsAndNoDefaultCtor : ITestObject, IEquatable<ReadWritePropsAndNoDefaultCtor>
{
public int UserID { get; set; }
public string UserName { get; set; }
public UserRoles UserRole { get; set; }
public ReadWritePropsAndNoDefaultCtor(int id, string name, UserRoles role)
{
UserID = id;
UserName = name;
UserRole = role;
}
public bool Equals(ReadWritePropsAndNoDefaultCtor that)
{
return UserID == that.UserID && UserName == that.UserName && UserRole == that.UserRole;
}
}
public class ReadWritePropsAndDefaultCtor : ITestObject, IEquatable<ReadWritePropsAndDefaultCtor>
{
public int UserID { get; set; }
public string UserName { get; set; }
public UserRoles UserRole { get; set; }
public ReadWritePropsAndDefaultCtor() { }
public ReadWritePropsAndDefaultCtor(int id, string name, UserRoles role)
{
UserID = id;
UserName = name;
UserRole = role;
}
public bool Equals(ReadWritePropsAndDefaultCtor that)
{
return UserID == that.UserID && UserName == that.UserName && UserRole == that.UserRole;
}
}
public class ReadOnlyPropsAndNoDefaultCtor : ITestObject, IEquatable<ReadOnlyPropsAndNoDefaultCtor>
{
[JsonProperty]
public int UserID { get; private set; }
[JsonProperty]
public string UserName { get; private set; }
[JsonProperty]
public UserRoles UserRole { get; private set; }
public ReadOnlyPropsAndNoDefaultCtor(int id, string name, UserRoles role)
{
UserID = id;
UserName = name;
UserRole = role;
}
public bool Equals(ReadOnlyPropsAndNoDefaultCtor that)
{
return UserID == that.UserID && UserName == that.UserName && UserRole == that.UserRole;
}
}
public class ReadOnlyPropsAndDefaultCtor : ITestObject, IEquatable<ReadOnlyPropsAndDefaultCtor>
{
[JsonProperty]
public int UserID { get; private set; }
[JsonProperty]
public string UserName { get; private set; }
[JsonProperty]
public UserRoles UserRole { get; private set; }
public ReadOnlyPropsAndDefaultCtor() { }
public ReadOnlyPropsAndDefaultCtor(int id, string name, UserRoles role)
{
UserID = id;
UserName = name;
UserRole = role;
}
public bool Equals(ReadOnlyPropsAndDefaultCtor that)
{
return UserID == that.UserID && UserName == that.UserName && UserRole == that.UserRole;
}
}
public class ReadOnlyPropsWithBackingFieldsAndNoDefaultCtor : ITestObject, IEquatable<ReadOnlyPropsWithBackingFieldsAndNoDefaultCtor>
{
[JsonProperty("UserID")]
private readonly int userID;
[JsonProperty("UserName")]
private readonly string userName;
[JsonProperty("UserRole")]
private readonly UserRoles userRole;
[JsonIgnore]
public int UserID
{
get { return userID; }
}
[JsonIgnore]
public string UserName
{
get { return userName; }
}
[JsonIgnore]
public UserRoles UserRole
{
get { return userRole; }
}
public ReadOnlyPropsWithBackingFieldsAndNoDefaultCtor(int id, string name, UserRoles role)
{
userID = id;
userName = name;
userRole = role;
}
public bool Equals(ReadOnlyPropsWithBackingFieldsAndNoDefaultCtor that)
{
return UserID == that.UserID && UserName == that.UserName && UserRole == that.UserRole;
}
}
#endregion
#region Case 1
[Test]
public void SerializeReadWritePropsAndNoDefaultCtor()
{
var obj = new ReadWritePropsAndNoDefaultCtor(USER_ID, USER_NAME, USER_ROLE);
TestHelper.AssertCanSerialize(obj, USER_IN_JSON);
}
[Test]
public void DeserializeReadWritePropsAndNoDefaultCtor()
{
var obj = new ReadWritePropsAndNoDefaultCtor(USER_ID, USER_NAME, USER_ROLE);
TestHelper.AssertCanDeserialize(USER_IN_JSON, obj);
}
#endregion
#region Case 2
[Test]
public void SerializeReadWritePropsAndDefaultCtor()
{
var obj = new ReadWritePropsAndDefaultCtor(USER_ID, USER_NAME, USER_ROLE);
TestHelper.AssertCanSerialize(obj, USER_IN_JSON);
}
[Test]
public void DeserializeReadWritePropsAndDefaultCtor()
{
var obj = new ReadWritePropsAndDefaultCtor(USER_ID, USER_NAME, USER_ROLE);
TestHelper.AssertCanDeserialize(USER_IN_JSON, obj);
}
#endregion
#region Case 3
[Test]
public void SerializeReadOnlyPropsAndNoDefaultCtor()
{
var obj = new ReadOnlyPropsAndNoDefaultCtor(USER_ID, USER_NAME, USER_ROLE);
TestHelper.AssertCanSerialize(obj, USER_IN_JSON);
}
[Test]
public void DeserializeReadOnlyPropsAndNoDefaultCtor()
{
var obj = new ReadOnlyPropsAndNoDefaultCtor(USER_ID, USER_NAME, USER_ROLE);
TestHelper.AssertCanDeserialize(USER_IN_JSON, obj);
}
#endregion
#region Case 4
[Test]
public void SerializeReadOnlyPropsAndDefaultCtor()
{
var obj = new ReadOnlyPropsAndDefaultCtor(USER_ID, USER_NAME, USER_ROLE);
TestHelper.AssertCanSerialize(obj, USER_IN_JSON);
}
[Test]
public void DeserializeReadOnlyPropsAndDefaultCtor()
{
var obj = new ReadOnlyPropsAndDefaultCtor(USER_ID, USER_NAME, USER_ROLE);
TestHelper.AssertCanDeserialize(USER_IN_JSON, obj);
}
#endregion
#region Case 5
[Test]
public void SerializeReadOnlyPropsWithBackingFieldsAndNoDefaultCtor()
{
var obj = new ReadOnlyPropsWithBackingFieldsAndNoDefaultCtor(USER_ID, USER_NAME, USER_ROLE);
TestHelper.AssertCanSerialize(obj, USER_IN_JSON);
}
[Test]
public void DeserializeReadOnlyPropsWithBackingFieldsAndNoDefaultCtor()
{
var obj = new ReadOnlyPropsWithBackingFieldsAndNoDefaultCtor(USER_ID, USER_NAME, USER_ROLE);
TestHelper.AssertCanDeserialize(USER_IN_JSON, obj);
}
#endregion
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment