2016-03-28 26 views
0
public class StorageOfData 
{ 
    public static StorageOfData instance; 

    private StorageOfData() 
    { } 

    public static StorageOfData getInstance() 
    { 
     if (instance == null) 
      instance = new StorageOfData(); 
     return instance; 
    } 

    private List<List<VersionOfFile>> list = new List<List<VersionOfFile>>(); 

    public List<VersionOfFile> this[int index] 
    { 
     get 
     { 
      return list[index]; 
     } 
    } 

    public void RestoreDataFromFile(String path) 
    { 
     StorageOfData DATA; 
     XmlSerializer mySerializer = new XmlSerializer(typeof(StorageOfData)); 
     FileStream myFileStream = new FileStream(path + @"BAK\" + "history.xml", FileMode.Open); 
     DATA = (StorageOfData)mySerializer.Deserialize(myFileStream); 
    } 

    public void SaveDataToFile(String path) 
    { 
     StorageOfData DATA = StorageOfData.getInstance(); 
     XmlSerializer mySerializer = new XmlSerializer(typeof(StorageOfData)); 
     StreamWriter myWriter = new StreamWriter(path + @"BAK\" + "history.xml"); 
     mySerializer.Serialize(myWriter, DATA); 
     myWriter.Close(); 
    } 

    public void AddNewEntryIfRenamed(string filename, string real_filename, DateTime date, bool isDeleted) 
    { 
     for (int i = 0; i < list.Count; i++) 
     { 

      if (list[i][list[i].Count - 1].Filename == filename) 
      { 
       list[i].Add(new VersionOfFile(filename, real_filename, date, isDeleted)); 
       return; 
      } 
     } 
     list.Add(new List<VersionOfFile>()); 
     list[list.Count - 1].Add(new VersionOfFile(filename, real_filename, date, isDeleted)); 
    } 


    public void AddNewEntryIfCopyExists(string filename, string real_filename, DateTime date, bool isDeleted) 
    { 
     for (int i = 0; i < list.Count; i++) 
     { 

      if (list[i][list[i].Count - 1].Filename == filename) 
      { 
       list[i].Add(new VersionOfFile(filename, real_filename, date, isDeleted)); 
       return; 
      } 
     } 
     list.Add(new List<VersionOfFile>()); 
     list[list.Count - 1].Add(new VersionOfFile(filename, real_filename, date, isDeleted)); 
    } 

    public void AddNewEntry(string filename, DateTime date, bool isDeleted) 
    { 
     for (int i = 0; i < list.Count; i++) 
     { 

      if (list[i][list[i].Count - 1].Filename == filename) 
      { 
       list[i].Add(new VersionOfFile(filename, date, isDeleted)); 
       return; 
      } 
     } 
     list.Add(new List<VersionOfFile>()); 
     list[list.Count - 1].Add(new VersionOfFile(filename, date, isDeleted)); 
    } 

} 

internal struct VersionOfFile 
{ 
    private string filename; 
    private string real_filename; 
    private DateTime date; 
    private bool isDeleted; 

    public string Filename 
    { 
     get 
     { 
      return filename; 
     } 
    } 

    public string Real_filename 
    { 
     get 
     { 
      return real_filename; 
     } 
    } 

    public DateTime Date 
    { 
     get 
     { 
      return date; 
     } 
    } 

    public bool IsDeleted 
    { 
     get 
     { 
      return isDeleted; 
     } 
    } 

    public VersionOfFile(string filename, string real_filename, DateTime date, bool isDeleted) 
    { 
     this.filename = filename; 
     this.real_filename = real_filename; 
     this.date = date; 
     this.isDeleted = isDeleted; 
    } 

    public VersionOfFile(string filename, DateTime date, bool isDeleted) 
    { 
     this.filename = filename; 
     this.date = date; 
     this.isDeleted = isDeleted; 
     this.real_filename = String.Empty; 
    } 

Dosyalarımı yedeklemek için basit bir program yazıyorum ama bir sorunla karşılaşıyorum. Değişiklikleri günlüğe kaydetmeliyim, ancak değişikliklerle ilgili tek nokta depolama bilgimi serileştirmeye çalıştığımda boş bir .xml dosyası alıyorum. Dinamizik dizileri seri hale getirmek için ne yapmalıyım (Liste <>) ??neden XML-serialization çalışmıyor

+1

Tamam ... tüm saygılarımla @ Byg1 'basit bir program' için şeyleri karmaşıklaştırıyorsunuz ... Tam olarak ne elde etmek istediğinizi açıklayabileceğinizi veya görmeyi beklediğiniz XML örneğini sağlayabileceğinizi açıklayabilirsiniz .... – Monty

+1

'StorageOfData' sınıfınızı' XmlSerializer' ile serileştirmek için kamu parametresiz bir kurucu var. Seninki özel. Http://stackoverflow.com/questions/267724/why-xml-serializable-class-need-a-parameterless-constructor adresine bakın. Bunun ötesinde başka problemlerin olabilir. Bunu yaparsanız, kodunuzu her sorunun [en azı, tam örnekleri] (http://stackoverflow.com/help/mcve) içine almayı deneyin. – dbc

+1

Ayrıca, 'XmlSerializer', yalnızca' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' karakterleri ile serileştirir. Https://stackoverflow.com/questions/575432/why-isnt-my-public-property-serialized-by-the-xmlserializer adresine bakın. Yani, 'VersionOfFile' dosyanız doğru şekilde serileştirilmeyecek. – dbc

cevap

0

Sınıfınızı serileştirmek için serileştirilecek veriler için genel okuma/yazma öznitelikleri koymalısınız.

Sadece StorageOfData sınıfına için

public List<List<VersionOfFile>> List 
    { 
     get { return list; } 
     set { list = value; } 
    } 

ekleyip VersionOfFile yapı ayrıntılarda ayarlayıcı ekleyin.

PS:

Kodunuz ihtiyacı için optimize edilmemiştir. Tekil sınıfınızın Thread safe Singleton güvenliğini sağlamaya çalışın. dosya boyutunu azaltmak için performans sorun için >> Sözlük < dize, Liste < OfFileVersion kullanabilirsiniz" ve yapının özelliklerine [XmlAttribute] etiketi ekleyin. Yerine

<VersionOfFile> 
    <Filename>test</Filename> 
    </VersionOfFile> 

Sen alacak

<VersionOfFile Filename="test"/> 

Ekle/Yakala Bloc, Geri Klasör Varsa Test Et, Yol eklemek için System.IO.Path.Combine kullanın, History.xml dosyasının var olup olmadığını test edin ve yeni dosya eklemeden önce yedekleyin vb.