Skip to content

Instantly share code, notes, and snippets.

@pauldbau
Created June 2, 2012 11:47
Show Gist options
  • Save pauldbau/2857983 to your computer and use it in GitHub Desktop.
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
// 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