Yan Cui
I help clients go faster for less using serverless technologies.
This article is brought to you by
Don’t reinvent the patterns. Catalyst gives you consistent APIs for messaging, data, and workflow with key microservice patterns like circuit-breakers and retries for free.
Cranked these out last night, hope you find it useful too
1: public static class SerializationExtensions
2: {
3: private static readonly ConcurrentDictionary<Type, XmlSerializer> XmlSerializers =
4: new ConcurrentDictionary<Type, XmlSerializer>();
5:
6: private static readonly ConcurrentDictionary<Type, DataContractJsonSerializer> JsonSerializers =
7: new ConcurrentDictionary<Type, DataContractJsonSerializer>();
8:
9: private static readonly JavaScriptSerializer JavaScriptSerializer = new JavaScriptSerializer();
10:
11: public enum JsonSerializerType
12: {
13: Undefined = 0,
14:
15: DataContractJsonSerializer = 1,
16:
17: JavaScriptSerializer = 2
18: }
19:
20: /// <summary>
21: /// Serializes the object using XML format.
22: /// </summary>
23: public static string SerializeAsXml(this object obj)
24: {
25: var type = obj.GetType();
26: var xmlSerializer = GetXmlSerializer(type);
27:
28: using (var memStream = new MemoryStream())
29: {
30: xmlSerializer.Serialize(memStream, obj);
31: return Encoding.Default.GetString(memStream.ToArray());
32: }
33: }
34:
35: /// <summary>
36: /// Serializes the object using JSON format, either using the default
37: /// DataContractJsonSerializer or the JavaScriptSerializer, the results
38: /// differ slightly.
39: /// </summary>
40: public static string SerializeAsJson(
41: this object obj,
42: JsonSerializerType serializerType = JsonSerializerType.DataContractJsonSerializer)
43: {
44: switch (serializerType)
45: {
46: case JsonSerializerType.JavaScriptSerializer:
47: return JavaScriptSerializer.Serialize(obj);
48: case JsonSerializerType.DataContractJsonSerializer:
49: default:
50: var type = obj.GetType();
51: var serializer = GetJsonSerializer(type);
52:
53: using (var memStream = new MemoryStream())
54: {
55: serializer.WriteObject(memStream, obj);
56: return Encoding.Default.GetString(memStream.ToArray());
57: }
58: }
59: }
60:
61: /// <summary>
62: /// Deserializes the specified XML string to an object of the specified type T.
63: /// </summary>
64: public static T DeserializeAsXml<T>(this string xmlString)
65: {
66: var xmlSerializer = GetXmlSerializer(typeof(T));
67: using (var memStream = new MemoryStream(Encoding.Default.GetBytes(xmlString)))
68: {
69: return (T)xmlSerializer.Deserialize(memStream);
70: }
71: }
72:
73: /// <summary>
74: /// Deserializes the specified JSON string to an object of the specified type T.
75: /// </summary>
76: public static T DeserializeAsJson<T>(
77: this string jsonString,
78: JsonSerializerType serializerType = JsonSerializerType.DataContractJsonSerializer)
79: {
80: switch (serializerType)
81: {
82: case JsonSerializerType.JavaScriptSerializer:
83: return JavaScriptSerializer.Deserialize<T>(jsonString);
84: case JsonSerializerType.DataContractJsonSerializer:
85: default:
86: var serializer = GetJsonSerializer(typeof(T));
87:
88: using (var memStream = new MemoryStream(Encoding.Default.GetBytes(jsonString)))
89: {
90: return (T)serializer.ReadObject(memStream);
91: }
92: }
93: }
94:
95: private static XmlSerializer GetXmlSerializer(Type type)
96: {
97: // gets the xml serializer from the concurrent dictionary, if it doesn't exist
98: // then add one for the specified type
99: return XmlSerializers.GetOrAdd(type, t => new XmlSerializer(t));
100: }
101:
102: private static DataContractJsonSerializer GetJsonSerializer(Type type)
103: {
104: // gets the json serializer from the concurrent dictionary, if it doesn't exist
105: // then add one for the specified type
106: return JsonSerializers.GetOrAdd(type, t => new DataContractJsonSerializer(t));
107: }
108: }
Whenever you’re ready, here are 3 ways I can help you:
- Production-Ready Serverless: Join 20+ AWS Heroes & Community Builders and 1000+ other students in levelling up your serverless game. This is your one-stop shop for quickly levelling up your serverless skills.
- I help clients launch product ideas, improve their development processes and upskill their teams. If you’d like to work together, then let’s get in touch.
- Join my community on Discord, ask questions, and join the discussion on all things AWS and Serverless.