MonoTouch: Как сериализовать тип (например, CLLocation), не помеченный как Serializable? - PullRequest
2 голосов
/ 12 октября 2011

Я работаю над проектом iPhone с использованием MonoTouch, и мне нужно сериализовать и сохранить простой объект, принадлежащий классу ac #, с типом CLLocation в качестве члена данных:

[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;
}

Это мой двоичный файлМетод сериализации:

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 ();
        }
    }

Но когда я выполняю этот код (myObject является экземпляром вышеуказанного класса):

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

Я получаю это исключение:

ОШИБКА: Тип MonoTouch.CoreLocation.CLLocation не помечен как Сериализуемый.

Есть ли способ сериализации класса с помощью CLLocation?

Ответы [ 2 ]

5 голосов
/ 12 октября 2011

Поскольку класс не помечен атрибутом SerializableAttribute, его нельзя сериализовать.Однако, немного поработав, вы можете сохранить необходимую информацию и сериализовать ее, в то же время сохранив ее в своем объекте.

Это можно сделать, создав для нее свойство с помощьюсоответствующие резервные магазины, в зависимости от информации, которую вы хотите от него.Например, если мне нужны только координаты объекта CLLocation, я бы создал следующее:

[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;
        }

    }
}
2 голосов
/ 12 октября 2011

Вы не можете добавить [Serializable] к типам MonoTouch.Другая альтернатива (отличному предложению Димитриса) - использовать ISerializable для вашего собственного типа.

Это даст вам полный контроль над сериализацией данных вашего типа.Вы также можете смешать оба подхода, используйте [Serializable], если это возможно, или ISerializable в другом месте внутри вашего проекта.

...