/
ISerializer.cs
148 lines (132 loc) · 5.57 KB
/
ISerializer.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
using System;
using System.Globalization;
using System.Reflection;
namespace PlayFab.Json
{
[Obsolete("This interface is deprecated, please use PlayFab.ISerializerPlugin instead.", false)]
public interface ISerializer: ISerializerPlugin
{
}
public static class JsonWrapper
{
private static ISerializerPlugin _instance = new SimpleJsonInstance();
/// <summary>
/// Use this property to override the Serialization for the SDK.
/// </summary>
public static ISerializerPlugin Instance
{
get { return _instance; }
set { _instance = value; }
}
public static T DeserializeObject<T>(string json)
{
return _instance.DeserializeObject<T>(json);
}
public static T DeserializeObject<T>(string json, object jsonSerializerStrategy)
{
return _instance.DeserializeObject<T>(json, jsonSerializerStrategy);
}
public static object DeserializeObject(string json)
{
return _instance.DeserializeObject(json);
}
public static string SerializeObject(object json)
{
return _instance.SerializeObject(json);
}
public static string SerializeObject(object json, object jsonSerializerStrategy)
{
return _instance.SerializeObject(json, jsonSerializerStrategy);
}
}
public class SimpleJsonInstance : ISerializerPlugin
{
public static PlayFabJsonSerializerStrategy ApiSerializerStrategy = new PlayFabJsonSerializerStrategy();
private static DateTimeStyles _dateTimeStyles = DateTimeStyles.RoundtripKind;
public class PlayFabJsonSerializerStrategy : PocoJsonSerializerStrategy
{
/// <summary>
/// Convert the json value into the destination field/property
/// </summary>
public override object DeserializeObject(object value, Type type)
{
var valueStr = value as string;
if (valueStr == null) // For all of our custom conversions, value is a string
return base.DeserializeObject(value, type);
var underType = Nullable.GetUnderlyingType(type);
if (underType != null)
return DeserializeObject(value, underType);
else if (type.GetTypeInfo().IsEnum)
return Enum.Parse(type, (string)value, true);
else if (type == typeof(DateTime))
{
DateTime output;
var result = DateTime.TryParseExact(valueStr, PlayFabUtil.DefaultDateTimeFormats, CultureInfo.CurrentCulture, _dateTimeStyles, out output);
if (result)
return output;
}
else if (type == typeof(DateTimeOffset))
{
DateTimeOffset output;
var result = DateTimeOffset.TryParseExact(valueStr, PlayFabUtil.DefaultDateTimeFormats, CultureInfo.CurrentCulture, _dateTimeStyles, out output);
if (result)
return output;
}
else if (type == typeof(TimeSpan))
{
double seconds;
if (double.TryParse(valueStr, out seconds))
return TimeSpan.FromSeconds(seconds);
}
return base.DeserializeObject(value, type);
}
/// <summary>
/// Set output to a string that represents the input object
/// </summary>
protected override bool TrySerializeKnownTypes(object input, out object output)
{
if (input.GetType().GetTypeInfo().IsEnum)
{
output = input.ToString();
return true;
}
else if (input is DateTime)
{
output = ((DateTime)input).ToString(PlayFabUtil.DefaultDateTimeFormats[PlayFabUtil.DEFAULT_UTC_OUTPUT_INDEX], CultureInfo.CurrentCulture);
return true;
}
else if (input is DateTimeOffset)
{
output = ((DateTimeOffset)input).ToString(PlayFabUtil.DefaultDateTimeFormats[PlayFabUtil.DEFAULT_UTC_OUTPUT_INDEX], CultureInfo.CurrentCulture);
return true;
}
else if (input is TimeSpan)
{
output = ((TimeSpan)input).TotalSeconds;
return true;
}
return base.TrySerializeKnownTypes(input, out output);
}
}
public T DeserializeObject<T>(string json)
{
return PlayFabSimpleJson.DeserializeObject<T>(json, ApiSerializerStrategy);
}
public T DeserializeObject<T>(string json, object jsonSerializerStrategy)
{
return PlayFabSimpleJson.DeserializeObject<T>(json, (IJsonSerializerStrategy)jsonSerializerStrategy);
}
public object DeserializeObject(string json)
{
return PlayFabSimpleJson.DeserializeObject(json, typeof(object), ApiSerializerStrategy);
}
public string SerializeObject(object json)
{
return PlayFabSimpleJson.SerializeObject(json, ApiSerializerStrategy);
}
public string SerializeObject(object json, object jsonSerializerStrategy)
{
return PlayFabSimpleJson.SerializeObject(json, (IJsonSerializerStrategy)jsonSerializerStrategy);
}
}
}