我正在使用MonoTouch处理iPhone项目,我需要序列化并保存属于c#类的简单对象,并将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序列化一个类?
答案 0 :(得分:5)
由于类未使用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;
}
}
}
答案 1 :(得分:2)
您无法将[Serializable]
添加到MonoTouch类型。另一种选择(对于Dimitris极好的建议)是在你自己的类型上使用ISerializable
。
这将使您可以完全控制如何序列化类型中的数据。您也可以混合使用这两种方法,尽可能使用[Serializable]
或在项目中使用ISerializable
。