在Windows Phone 7 XNA中保存对象列表
我需要保存一个对象列表,这些对象是从我创建的类创建的。我该怎么办 我尝试了XmlSerializer,并将[XmlElement]添加到需要序列化的字段中。但它一直告诉我“XML文档中有一个错误”。 我还尝试了DataContractSerializer,使用了[DataContract]和[DataMember],但它无法保存我的对象 这两个存储类都适用于基本元素(int、bool..等),但不适用于我的对象 以下是我的保存代码:在Windows Phone 7 XNA中保存对象列表,xna,datacontractserializer,xmlserializer,windows-phone,isolatedstoragefile,Xna,Datacontractserializer,Xmlserializer,Windows Phone,Isolatedstoragefile,我需要保存一个对象列表,这些对象是从我创建的类创建的。我该怎么办 我尝试了XmlSerializer,并将[XmlElement]添加到需要序列化的字段中。但它一直告诉我“XML文档中有一个错误”。 我还尝试了DataContractSerializer,使用了[DataContract]和[DataMember],但它无法保存我的对象 这两个存储类都适用于基本元素(int、bool..等),但不适用于我的对象 以下是我的保存代码: using (IsolatedStorageF
using (IsolatedStorageFile saveGameFile = IsolatedStorageFile.GetUserStoreForApplication())
using (IsolatedStorageFileStream SaveGameStream = new IsolatedStorageFileStream("GemsCollector1.dat", FileMode.OpenOrCreate, saveGameFile))
{
XmlSerializer serializer = new XmlSerializer(typeof(List<Card>));
serializer.Serialize(SaveGameStream, Cards);
}
有人能告诉我如何在XNA中保存用户定义对象列表吗?您正在尝试序列化私有属性。这在Windows Phone 7上不受支持。这很容易导致错误
此外,您还必须确保用于属性的所有类型都是可序列化的,并且所有类型都具有空构造函数。是否尝试将其保存到手机的IsolatedStorage?如果是这样,您可能应该发布序列化代码。是的,到IsolatedStroage,我刚刚添加了我的codeRight,因此错误与您尝试序列化的“Card”对象有关。我认为我们可以放心地假设您没有使类属性可序列化。所以你也必须在这里发布Card类。好的,我刚刚添加了我的类,我删除了方法,因为它们太长了。默认情况下,枚举是可序列化的。此外,如果类是可序列化的,则不必显式地将成员标记为可序列化的。
using (IsolatedStorageFile saveGameFile = IsolatedStorageFile.GetUserStoreForApplication())
using (IsolatedStorageFileStream saveGameStream = new IsolatedStorageFileStream("GemsCollector1.dat", FileMode.OpenOrCreate, saveGameFile))
{
if (saveGameStream.Length > 0)
{
XmlSerializer serializer = new XmlSerializer(typeof(List<Card>));
Cards = (List<Card>)serializer.Deserialize(saveGameStream);
}
}
public class Card
{
[XmlElement]
public CardType CardType { get; set; }
[XmlElement]
public CardColor CardColor { get; set; }
[XmlElement]
public int Value { get; set; }
[XmlElement]
public Vector2 Position { get; set; }
[XmlElement]
public PlayerPosition playerPosition { get; set; }
[XmlElement]
public CardStatus Status { get; set; }
public Rectangle BoundingBox
{
get
{
int width = (playerPosition == PlayerPosition.Left || playerPosition == PlayerPosition.Right) ? 150 : 100;
int height = (playerPosition == PlayerPosition.Left || playerPosition == PlayerPosition.Right) ? 100 : 150;
return new Rectangle((int)Position.X, (int)Position.Y, width, height); ;
}
}
[XmlElement]
public bool isUsed;
public Vector2 endPosition = new Vector2(235,200);
public Rectangle ThrowArea = new Rectangle(235, 200, 350, 120);
[XmlElement]
public string cardTextureName;
private string back = "back";
private static bool ReserveDrag;
[XmlElement]
private Vector2 touchFromCenter;
[XmlElement]
private int touchId;
public Card()
{
}
}