Created
June 2, 2012 11:47
-
-
Save pauldbau/2857983 to your computer and use it in GitHub Desktop.
ServiceStack/MonoTouch: Fixes to JsonAotConfig for issue of null List<Guid> properties on response objects
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
// Excerpt from ServiceStack.Text - JsConfig.cs | |
[MonoTouch.Foundation.Preserve(AllMembers=true)] | |
internal class JsonAotConfig | |
{ | |
static JsReader<JsonTypeSerializer> reader; | |
static JsWriter<JsonTypeSerializer> writer; | |
static JsonTypeSerializer serializer; | |
static JsonAotConfig() | |
{ | |
serializer = new JsonTypeSerializer(); | |
reader = new JsReader<JsonTypeSerializer>(); | |
writer = new JsWriter<JsonTypeSerializer>(); | |
} | |
public static ParseStringDelegate GetParseFn(Type type) | |
{ | |
var parseFn = JsonTypeSerializer.Instance.GetParseFn(type); | |
return parseFn; | |
} | |
internal static ParseStringDelegate RegisterBuiltin<T>() | |
{ | |
var i = 0; | |
if (reader.GetParseFn<T>() != null) i++; | |
if (JsonReader<T>.GetParseFn() != null) i++; | |
if (JsonReader<T>.Parse(null) != null) i++; | |
if (JsonWriter<T>.WriteFn() != null) i++; | |
return serializer.GetParseFn<T>(); | |
} | |
public static void Register<T>() | |
{ | |
var i = 0; | |
var serializer = JsonTypeSerializer.Instance; | |
if (new List<T>() != null) i++; | |
if (new T[0] != null) i++; | |
if (serializer.GetParseFn<T>() != null) i++; | |
if (DeserializeArray<T[], JsonTypeSerializer>.Parse != null) i++; | |
JsConfig<T>.ExcludeTypeInfo = false; | |
//JsConfig<T>.SerializeFn = arg => ""; | |
//JsConfig<T>.DeSerializeFn = arg => default(T); | |
DeserializeArrayWithElements<T, JsonTypeSerializer>.ParseGenericArray(null, null); | |
DeserializeCollection<JsonTypeSerializer>.ParseCollection<T>(null, null, null); | |
DeserializeListWithElements<T, JsonTypeSerializer>.ParseGenericList(null, null, null); | |
SpecializedQueueElements<T>.ConvertToQueue(null); | |
SpecializedQueueElements<T>.ConvertToStack(null); | |
WriteListsOfElements<T, JsonTypeSerializer>.WriteList(null, null); | |
WriteListsOfElements<T, JsonTypeSerializer>.WriteIList(null, null); | |
WriteListsOfElements<T, JsonTypeSerializer>.WriteEnumerable(null, null); | |
WriteListsOfElements<T, JsonTypeSerializer>.WriteListValueType(null, null); | |
WriteListsOfElements<T, JsonTypeSerializer>.WriteIListValueType(null, null); | |
JsonReader<T>.Parse(null); | |
JsonWriter<T>.WriteFn(); | |
TranslateListWithElements<T>.LateBoundTranslateToGenericICollection(null, null); | |
TranslateListWithConvertibleElements<T, T>.LateBoundTranslateToGenericICollection(null, null); | |
QueryStringWriter<T>.WriteObject(null, null); | |
} | |
// Edited to fix issues with null List<Guid> properties in response objects | |
public static void RegisterElement<T, TElement>() | |
{ | |
RegisterBuiltin<TElement>(); | |
DeserializeDictionary<JsonTypeSerializer>.ParseDictionary<T, TElement>(null, null, null, null); | |
DeserializeDictionary<JsonTypeSerializer>.ParseDictionary<TElement, T>(null, null, null, null); | |
ToStringDictionaryMethods<T, TElement, JsonTypeSerializer>.WriteIDictionary(null, null, null, null); | |
ToStringDictionaryMethods<TElement, T, JsonTypeSerializer>.WriteIDictionary(null, null, null, null); | |
// Include List deserialisations from the Register<> method above. This solves issue where List<Guid> properties on responses deserialise to null. | |
// No idea why this is happening because there is no visible exception raised. Suspect MonoTouch is swallowing an AOT exception somewhere. | |
DeserializeArrayWithElements<TElement, JsonTypeSerializer>.ParseGenericArray(null, null); | |
DeserializeListWithElements<TElement, JsonTypeSerializer>.ParseGenericList(null, null, null); | |
// Cannot use the line below for some unknown reason - when trying to compile to run on device, mtouch bombs during native code compile. | |
// Something about this line or its inner workings is offensive to mtouch. Luckily this was not needed for my List<Guide> issue. | |
// DeserializeCollection<JsonTypeSerializer>.ParseCollection<TElement>(null, null, null); | |
TranslateListWithElements<TElement>.LateBoundTranslateToGenericICollection(null, typeof(List<TElement>)); | |
TranslateListWithConvertibleElements<TElement, TElement>.LateBoundTranslateToGenericICollection(null, typeof(List<TElement>)); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment