2 Stimmen

MonoTouch : Wie serialisiert man einen Typ (wie CLLocation), der nicht als serialisierbar markiert ist?

Ich arbeite an einem iPhone-Projekt mit MonoTouch, und ich brauche zu serialisieren und speichern Sie ein einfaches Objekt, das eine c#-Klasse mit einem CLLocation-Typ als Daten-Mitglied gehört:

[Serializable]
public class MyClass
{
    public MyClass (CLLocation gps_location, string location_name)
    {
        this.gps_location = gps_location;
        this.location_name = location_name;
    }

    public string location_name;
    public CLLocation gps_location;
}

Dies ist meine Methode zur binären Serialisierung:

static void SaveAsBinaryFormat (object objGraph, string fileName)
    {
        BinaryFormatter binFormat = new BinaryFormatter ();
        using (Stream fStream = new FileStream (fileName, FileMode.Create, FileAccess.Write, FileShare.None)) {
            binFormat.Serialize (fStream, objGraph);
            fStream.Close ();
        }
    }

Aber wenn ich diesen Code ausführe (myObject ist eine Instanz der oben genannten Klasse):

try {
            SaveAsBinaryFormat (myObject, filePath);
            Console.WriteLine ("object Saved");
        } catch (Exception ex) {
            Console.WriteLine ("ERROR: " + ex.Message);
        }

Ich erhalte diese Ausnahme:

ERROR: Der Typ MonoTouch.CoreLocation.CLLocation ist nicht als serialisierbar gekennzeichnet.

Gibt es eine Möglichkeit, eine Klasse mit CLLocation zu serialisieren?

5voto

Dimitris Tavlikos Punkte 8158

Da eine Klasse nicht mit dem SerializableAttribut gekennzeichnet ist, kann sie nicht serialisiert werden. Mit etwas Mehraufwand können Sie jedoch die benötigten Informationen speichern und serialisieren, wobei sie gleichzeitig in Ihrem Objekt verbleiben.

Dazu erstellen Sie eine Eigenschaft mit den entsprechenden Sicherungsspeichern, je nachdem, welche Informationen Sie von ihr erwarten. Wenn ich zum Beispiel nur die Koordinaten des CLLocation-Objekts haben möchte, würde ich folgendes erstellen:

[Serializable()]
public class MyObject
{

    private double longitude;
    private double latitude;
    [NonSerialized()] // this is needed for this field, so you won't get the exception
    private CLLocation pLocation; // this is for not having to create a new instance every time

    // properties are ok    
    public CLLocation Location
    {
        get
        {
            if (this.pLocation == null)
            {
                this.pLocation = new CLLocation(this.latitude, this.longitude);
            }
            return this.pLocation;

        } set
        {
            this.pLocation = null;
            this.longitude = value.Coordinate.Longitude;
            this.latitude = value.Coordinate.Latitude;
        }

    }
}

2voto

poupou Punkte 43207

Sie können nicht hinzufügen [Serializable] zu MonoTouch-Typen. Eine weitere Alternative (zu Dimitris ausgezeichnetem Vorschlag) ist die Verwendung von ISerializable über Ihren eigenen Typ.

Damit haben Sie die volle Kontrolle darüber, wie die Daten Ihres Typs serialisiert werden. Sie können auch beide Ansätze mischen, indem Sie [Serializable] wenn möglich oder ISerializable sonst innerhalb Ihres Projekts.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X