Created
December 6, 2012 00:11
-
-
Save fernandoacorreia/4220772 to your computer and use it in GitHub Desktop.
Serializes to JSON preserving type information
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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