2011-01-26 6 views
1

クラスからオブジェクトのリストをシリアル化しようとしていて、ポイント(25,6)のXMLファイルにエラーが発生している数字は私が何をシリアル化しようとしているかによって変わります)。ここでWindows Phone 7の隔離されたストレージのシリアル化エラーがオブジェクトのリスト

は、私は、データをシリアル化しようとしているかの例です:

 
using (IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication()) 
{ 
    using((IsolatedStorageFileStream fs = isf.CreateFile("data.dat")) 
    { 
     XmlSerializer ser = new XmlSerializer(User.Data.GetType()); 
     ser.Serialize(fs, User.Data);
} }

そして、ここでは、私は、データをデシリアライズしています方法は次のとおりです。
 
using (IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication()) 
{ 
    if (isf.FileExists("Data.dat")) 
    { 
     using (IsolatedStorageFileStream fs = isf.OpenFile("Data.dat", System.IO.FileMode.Open)) 
     { 
      XmlSerializer ser = new XmlSerializer(User.Data.GetType()); 
      object obj = ser.Deserialize(fs); 
      if (null != obj && obj is Data) 
       User.Data= obj as Data; 
     } 
    } 
} 

私は、コードのこの部分を持つ任意の初期の問題が表示されませんしかし、私はそれを渡すオブジェクトのすべてのリストでクラッシュします。ここで

は、私が使用しているクラスのサンプルです:

 
public class Data 
    { 
     public static int counter; 

     public Data() { this.index = counter++; } 

     public DateTime availablefrom { get; set; } 
     public DateTime availableuntil { get; set; } 
     public string course { get; set; } 
     public DateTime? datetaken { get; set; } 
     public double duration { get; set; } 
     public string instructions { get; set; } 
     public string instructorname { get; set; } 
     public double scorepointscorrect { get; set; } 
     public double scorepointspossible { get; set; } 
     public string testname { get; set; } 
     public int index { get; private set; } 
    } 

私はシリアライザにそれが動作するだけの簡単なクラスを与えるので、私はシリアライザ自体が動作しているけど、私は、オブジェクトのリストを作成するときにするとき私のデータクラスまたは他のクラスから、クラッシュします。誰でも何か提案がありますか?

答えて

2

"index"はデータのパブリックプロパティなので、デシリアライザはその値を設定しようとしています。これは、 "インデックス"の設定がプライベートなので失敗します。 "index"をpublicではなくinternalに設定してください。正しくデシリアライズする必要があります。ここで

+0

私は私にプライベートに設定していなかったので、この提案はうまくいくと私は本当に望んでいた。しかし、internalに変更すると同じエラーが発生し、public setに変更しても同じエラーが発生しました。 System.Xml.dllで 'System.InvalidOperationException'型の未処理の例外が発生しました。 追加情報:XML文書(2、2)にエラーがあります。 – legacybass

+0

私は、回避策を見つけるために、シリアライザに私が逆シリアル化しようとしていたものとは異なる情報を伝えていたこのヘルプリクエストを投稿した後、昨夜変更を加えたことに気付きました。 "index"プロパティをinternalに変更した後、完全に機能します。皆さんは素晴らしいです! – legacybass

1

リストにあるタイプではなくリストタイプを渡してみてください。たとえば、次のように

のXmlSerializerシリアライザ=新しいXmlSerializerを(typeof演算(一覧<事件>));代わり

のXmlSerializerシリアライザ=新しいXmlSerializerを(typeof演算(インシデント))の

+0

私は実際に両方の方法を何回かそれを試してみました。私はシリアル化のステップとデシリアライズのステップで2つの組み合わせを試してみましたが、役に立たないものです。私はおそらく私のコード例ではっきりさせるべきだったはずですが、User.Dataは実際にはList オブジェクトです。クラスとオブジェクトの名前を変更してより一般的なものにしました。 – legacybass

0

は私が分離ストレージへとから、オブジェクトのロードリストを保存し、どのようにです:

private static IsolatedStorageFile _isoStore; 
    public static IsolatedStorageFile IsoStore 
    { 
     get { return _isoStore ?? (_isoStore = IsolatedStorageFile.GetUserStoreForApplication()); } 
    } 

    public static void SaveList<T>(string folderName, string dataName, ObservableCollection<T> dataList) where T : class 
    { 
     if (!IsoStore.DirectoryExists(folderName)) 
     { 
      IsoStore.CreateDirectory(folderName); 
     } 

     string fileStreamName = string.Format("{0}\\{1}.dat", folderName, dataName); 

     using (IsolatedStorageFileStream stream = new IsolatedStorageFileStream(fileStreamName, FileMode.Create, IsoStore)) 
     { 
      DataContractSerializer dcs = new DataContractSerializer(typeof(ObservableCollection<T>)); 
      dcs.WriteObject(stream, dataList); 
     } 
    } 

    public static ObservableCollection<T> LoadList<T>(string folderName, string dataName) where T : class 
    { 
     ObservableCollection<T> retval = new ObservableCollection<T>(); 

     string fileStreamName = string.Format("{0}\\{1}.dat", folderName, dataName); 

     using (IsolatedStorageFileStream stream = new IsolatedStorageFileStream(fileStreamName, FileMode.OpenOrCreate, IsoStore)) 
     { 
      if (stream.Length > 0) 
      { 
       DataContractSerializer dcs = new DataContractSerializer(typeof(ObservableCollection<T>)); 
       retval = dcs.ReadObject(stream) as ObservableCollection<T>; 
      } 
     } 

     return retval; 
    } 
関連する問題