0

System.Objectを使用してオブジェクトをシリアル化および逆シリアル化するための拡張メソッドがありますJson.Net。これは私の拡張メソッドです:

public static void SaveToFile(this object data, string FileName)
{
    using (StreamWriter writer = new StreamWriter(FileName))
    {
        string encode = WpfApplication.Helper.Encrypt(JsonConvert.SerializeObject(data));
        writer.Write(encode);
        writer.Close();
    }
}

public static void LoadFromFile<t>(this object data, string FileName)
{
    using (StreamReader reader = new StreamReader(FileName))
    {

        data = JsonConvert.DeserializeObject<t>(WpfApplication.Helper.Decrypt(reader.ReadToEnd()));
        reader.Close();
    }
}

そして、それは私がデシリアライズしたいクラスです:

public class CardPack
{
    #region Properties
    private string name;

    public string Name
    {
        get { return name; }
        set { name = value; }
    }

    private List<FlashCard> cards;

    public List<FlashCard> Cards
    {
        get { return cards; }
        set { cards = value; }
    }

    private bool registered;
    public bool Registered
    {
        get { return registered; }
        set { registered = value; }
    }

    private int currentCardIndex;

    public int CurrentCardIndex
    {
        get { return currentCardIndex; }
        set { currentCardIndex = value; }
    }

    public string RegisterKey { get; set; }

    public string ViewName { get; set; }

    public List<FlashCard> TodayCards { get; set; }
    #endregion
    ~CardPack()
    {
        foreach (FlashCard card in cards)
        {
            card.Check();
        }
        currentCardIndex = 0;
        TodayCards = null;
        this.SaveToFile(string.Format(System.IO.Path.GetDirectoryName(
  System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase).Split(@"file:\\")[1] + @"\Packs\{0}.json", name));
    }

しかし、クラスを逆シリアル化するたびにcards空になり、問題を解決する方法がわかりません。誰でも私を助けることができますか?

更新 このコードがあるときにエラーが見つかりました:

public CardPack(string Name)
    {
        this.name = Name;
        this.LoadFromFile<CardPack>(string.Format(System.IO.Path.GetDirectoryName(
  System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase).Split(@"file:\\")[1] + @"\Packs\{0}.json", name));
        foreach (var item in cards)
        {
            if (item.NextTime == null)
            {
                int a = 0;
            }
        }
        TodayCards = cards.Where(c => c.NextTime.Date == DateTime.Today).ToList();
    }

実行しようとするとアプリケーションが終了したためforeach (var item in cards)です。私はここcardsで尋ねて、それが空であることがわかりました!

update2CardPackオブジェクトを少し異なる構造でシリアライズしました。以前の構造Cardsのプロパティは読み取り専用でした。

4

1 に答える 1

0

data = JsonConvert.DeserializeObject<t>(WpfApplication.Helper.Decrypt(reader.ReadToEnd()));拡張メソッドでは「データ」クラスに変更されず、常にnullCardsであることがわかりました。CardPack後で拡張メソッドからクラスを設定できない理由を調べるために質問します。

于 2012-10-04T07:17:46.137 に答える