Skip to content

Instantly share code, notes, and snippets.

@fernandoacorreia
Created December 6, 2012 00:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save fernandoacorreia/4220772 to your computer and use it in GitHub Desktop.
Save fernandoacorreia/4220772 to your computer and use it in GitHub Desktop.
Serializes to JSON preserving type information
{
"Id": "b9c9e21a-caa4-4ed9-9282-27a54ad63ac0",
"Body": {
"$type": "ScheduleJobCommand",
"JobName": "name",
"Url": "url"
}
}
{
"Id": "36f4716c-21ee-4854-8313-25adfdd03545",
"Body": {
"$type": "CreateUserCommand",
"CreatedOn": "2012-12-06T00:10:27.6440139Z",
"LoginInfo": {
"UserName": "username",
"Password": "password"
}
}
}
36f4716c-21ee-4854-8313-25adfdd03545
username
using System;
using System.Runtime.Serialization;
using Newtonsoft.Json;
namespace JsonType1
{
public class TypeNameSerializationBinder : SerializationBinder
{
public string TypeFormat { get; private set; }
public TypeNameSerializationBinder(string typeFormat)
{
TypeFormat = typeFormat;
}
public override void BindToName(Type serializedType, out string assemblyName, out string typeName)
{
assemblyName = null;
typeName = serializedType.Name;
}
public override Type BindToType(string assemblyName, string typeName)
{
string resolvedTypeName = string.Format(TypeFormat, typeName);
return Type.GetType(resolvedTypeName, true);
}
}
internal class ScheduleJobCommand
{
public string JobName { get; set; }
public string Url { get; set; }
}
internal class LoginInfo
{
public string UserName { get; set; }
public string Password { get; set; }
}
internal class CreateUserCommand
{
public DateTime CreatedOn { get; set; }
public LoginInfo LoginInfo { get; set; }
}
public class Message
{
public Guid Id { get; set; }
[JsonProperty(TypeNameHandling = TypeNameHandling.All)]
public object Body { get; set; }
}
internal class Program
{
private static void Main(string[] args)
{
var scheduleJob = new ScheduleJobCommand
{
JobName = "name",
Url = "url"
};
var login = new LoginInfo
{
UserName = "username",
Password = "password"
};
var createUser = new CreateUserCommand
{
CreatedOn = DateTime.UtcNow,
LoginInfo = login
};
var msg1 = new Message
{
Id = Guid.NewGuid(),
Body = scheduleJob
};
var binder = new TypeNameSerializationBinder("JsonType1.{0}, JsonType1");
string serializedMsg1 = JsonConvert.SerializeObject(msg1,
Formatting.Indented,
new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.Auto,
Binder = binder
});
Console.WriteLine(serializedMsg1);
var msg2 = new Message
{
Id = Guid.NewGuid(),
Body = createUser
};
string serializedMsg2 = JsonConvert.SerializeObject(msg2,
Formatting.Indented,
new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.Auto,
Binder = binder
});
Console.WriteLine(serializedMsg2);
Message msg2b = JsonConvert.DeserializeObject<Message>(serializedMsg2, new JsonSerializerSettings
{
Binder = binder
});
Console.WriteLine(msg2b.Id);
Console.WriteLine(((CreateUserCommand) msg2b.Body).LoginInfo.UserName);
Console.WriteLine("Press ENTER to exit.");
Console.ReadLine();
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment