Da ich im Moment an der Engine zu einem XNA 2D Game werkele, kam ich heute zu dem Punkt, an dem ich Serialization brauche bzw. der SceneManager braucht es um die Entities zu speichern. Wie auch immer, jedenfalls muss das Zeug auf der XBox360 ebenfalls laufen. Deswegen SharpSerializer, denn der BinaryFormatterm welchen ich sonst benutze, gibts im Compact Framework nicht und der XmlSerializer? Mal ehrlich: Wer möchte bitte sämtlichen Scheiß als “Known Types” angeben sowie sich eigene, serialisierbare Listen bauen? Ich nicht. Also SharpSerializer. Die Verwendung ist auch ganz einfach, das sind mal grade 3 Zeilen Code. Doch es gibt ein Problem: Die Werte vom Vector2 werden nicht gespeichert, sind einfach leer, bzw. der ganze Vektor ist leer:

<complex name="SceneObject" type="TestGame.KackhaufenObject, TestGame">;
    <properties>
        <simple name="ReadyToRender" value="True" />
        <complex name="Position" type="Vector2"/>
        <complex name="Scale" type="Vector2" />
        <simple name="Rotation" value="0" />
    </properties>
</complex>

Tja, und nun? Zeit für ein bisschen hässlichen, unpassenden Improvisationscode! Als erstes besorgen wir uns den Sourcecode vom SharpSerializer. Danach öffnen wir das Projekt, konvertieren es ggf. und suchen dann im Ordner “Core” die Datei “Tools”, in der wir dann die Methode “IsSimple” ändern:

public static bool IsSimple(Type type)
{
    if (type == typeof (string))
    {
        return true;
    }
    if (type == typeof (DateTime))
    {
        return true;
    }
    if (type == typeof (TimeSpan))
    {
         return true;
    }
    if (type == typeof (Decimal))
    {
         // new since the version 2
         return true;
    }
    if (type.IsEnum)
    {
         return true;
    }
    // This is the added, interesting part: We tell the Serializer that this is a simple type! Aren't we evil? :)
    if (type == typeof(Vector2))
        return true;

    return type.IsPrimitive;
}

Jetzt kann der SharpSerializer den Typ Vector2 serialisieren. Versucht man jetzt aber das wieder zu DeSerialisieren, wird man in einer Exception auf folgende Datei verwiesen: “Advanced/SimpleValueConverter.cs” Ist ja logisch, er kennt den Typ ja nicht und weiß dementsprechend auch nicht, wie er ihn behandeln soll. Das ändern wir jetzt: In der Methode “ConvertFromString” fügen wir unter

if (type.IsEnum) return Enum.Parse(type, text, true);

folgendes ein:

if (type == typeof(Vector2))
{
    var xValue = 0;
    var yValue = 0;
    //remove braces
    var tmp = text.Replace('{', ' ');
    tmp = tmp.Replace('}', ' ');
    var array = tmp.ToCharArray();
    for (int i = 0; i &lt; array.Length; i++)
    {
        if (array[i] == 'Y')
        {
            var tmp2 = tmp.Remove(i - 1);
            xValue = Convert.ToInt32(tmp2.Remove(0, 3));
            var tmp3 = tmp.Remove(0, i + 2);
            yValue = Convert.ToInt32(tmp3);
         }
     }
     return new Vector2(xValue, yValue);
}

Ist zwar nicht unbedingt schön, aber es tut seinen Dienst. Jetzt kann man problemlos Vector2 serialisieren und auch wieder deserialisieren. Damit hab ich dann mein Tagespensum an Programmieren erreicht :)