Чтение / запись промежуточных значений с / на диск - PullRequest
0 голосов
/ 10 июля 2010

В настоящее время я работаю над этим приложением (C #, WPF, LINQ2XML, .NET 4.0), которое отображает подробности для «Животных». Примером этого может служить приложение, отображающее типы животных, такие как «Птицы», «Млекопитающие», «Рептилии». Для каждого типа животных у меня будут подпункты, такие как «Птицы», у меня будут подпункты, такие как «Воробей», «Ястреб»; для «Рептилий» у меня будут «Аллигаторы», «Питон»… и т. д. Пользователь будет иметь возможность добавлять комментарии для каждой из этих вложенных записей. Примером может послужить подпункт «Воробей», у меня будет опция «Добавить комментарии». При нажатии на «Добавить комментарии» откроется текстовое поле, в котором пользователь может ввести свои комментарии для «Воробей». Пользователь может вставить несколько комментариев для вложенной записи. Пользователь может иметь 1,2,3 .... n комментариев для 'Воробей'. Это просто повлечет за собой многократное нажатие кнопки «Добавить комментарии».

Данные предварительно загружены информацией, хранящейся в файлах XML. У меня есть отдельные XML-файлы для каждого животного, такие как Birds.xml, Mammals.xml, Reptiles.xml. Каждый из них будет иметь информацию относительно вложенных записей. В Birds.xml будут фрагменты XML для «Воробья» и «Ястреба».

Я использую Linq2Xml для извлечения информации, необходимой для заполнения моих животных объектов (Модель), которые, в свою очередь, связаны с Presenter (я использую шаблон Model-View-Presenter), который подается в XAML.

Я успешно могу отобразить информацию из моего XML в представлении. Проблема с комментариями.

Здесь нужно достичь двух вещей:

  1. Запишите все комментарии, добавленные в отдельный файл XML (AnimalComments.xml), где я могу хранить все комментарии, которые были добавлены для всех вложенных записей.

  2. В случае сбоя приложения я бы хотел, чтобы этот же XML-файл (AnimalComments.xml) предварительно заполнял все комментарии, которые я вводил до сбоя приложения.

По сути, я пытаюсь сериализовать состояние на диск, но в действительности я не хочу, чтобы весь граф объектов сохранялся на диске, поскольку я думаю, что собираюсь добавить функцию записи / добавления в AnimalComments. XML-файл всякий раз, когда для подпункта вводится комментарий, а фокус изменяется на какой-либо другой подпункт.

Мне было интересно, может ли коллективная мудрость SO помочь мне с некоторыми изящными рекомендациями по дизайну, чтобы собрать все добавленные Комментарии и сохранить их на диске таким образом, чтобы впоследствии его можно было использовать приложением для восстановления или представить в удобочитаемом формате. Любые решения, требующие использования СУБД, не будут уместны в этой ситуации, поскольку это является частью требования хранить любые данные, связанные с приложением, в локальной файловой системе.

Как предложил Дрейк ниже, есть способы сохранить ссылки на Животных, используя какой-то Первичный ключ, но меня интересует, как это следует решать с точки зрения объектно-ориентированного подхода или есть ли некоторые выдающиеся шаблоны, которые занимаются этим видом ситуации.

Спасибо

Ответы [ 2 ]

1 голос
/ 10 июля 2010

Я создал классы ниже.Пожалуйста, скопируйте код и передайте в редактор!

animals.cs

using System.Xml.Serialization;



/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://tempuri.org/XMLSchema.xsd")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://tempuri.org/XMLSchema.xsd", IsNullable=false)]
public partial class Animals {

    private Animal[] animalField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("Animal")]
    public Animal[] Animal {
        get {
            return this.animalField;
        }
        set {
            this.animalField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://tempuri.org/XMLSchema.xsd")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://tempuri.org/XMLSchema.xsd", IsNullable=false)]
public partial class Animal {

    private string nameField;

    private int idField;

    private bool idFieldSpecified;

    /// <remarks/>
    public string Name {
        get {
            return this.nameField;
        }
        set {
            this.nameField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public int ID {
        get {
            return this.idField;
        }
        set {
            this.idField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlIgnoreAttribute()]
    public bool IDSpecified {
        get {
            return this.idFieldSpecified;
        }
        set {
            this.idFieldSpecified = value;
        }
    }
}

AnimalComments.cs

using System.Xml.Serialization;




/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://tempuri.org/AnimalComments.xsd")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://tempuri.org/AnimalComments.xsd", IsNullable=false)]
public partial class Animals {

    private Animal[] animalField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("Animal")]
    public Animal[] Animal {
        get {
            return this.animalField;
        }
        set {
            this.animalField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://tempuri.org/AnimalComments.xsd")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://tempuri.org/AnimalComments.xsd", IsNullable=false)]
public partial class Animal {

    private Comments commentsField;

    private int idField;

    private bool idFieldSpecified;

    /// <remarks/>
    public Comments Comments {
        get {
            return this.commentsField;
        }
        set {
            this.commentsField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public int ID {
        get {
            return this.idField;
        }
        set {
            this.idField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlIgnoreAttribute()]
    public bool IDSpecified {
        get {
            return this.idFieldSpecified;
        }
        set {
            this.idFieldSpecified = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://tempuri.org/AnimalComments.xsd")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://tempuri.org/AnimalComments.xsd", IsNullable=false)]
public partial class Comments {

    private Comment[] commentField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("Comment")]
    public Comment[] Comment {
        get {
            return this.commentField;
        }
        set {
            this.commentField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://tempuri.org/AnimalComments.xsd")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://tempuri.org/AnimalComments.xsd", IsNullable=false)]
public partial class Comment {

    private string contentField;

    private int commentIDField;

    private bool commentIDFieldSpecified;

    /// <remarks/>
    public string Content {
        get {
            return this.contentField;
        }
        set {
            this.contentField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public int CommentID {
        get {
            return this.commentIDField;
        }
        set {
            this.commentIDField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlIgnoreAttribute()]
    public bool CommentIDSpecified {
        get {
            return this.commentIDFieldSpecified;
        }
        set {
            this.commentIDFieldSpecified = value;
        }
    }
}

Приветствия.

1 голос
/ 10 июля 2010

По моему мнению, ваши проблемы связаны только с тем, как мы организуем структуру данных. Итак, давайте посмотрим на каждую проблему:

1

Написать все комментарии, добавленные в отдельный файл XML (AnimalComments.xml) где я могу хранить все комментарии которые были добавлены для всех суб-запись

Я предлагаю, чтобы в файле animals.xml вы добавили уникальное поле идентификатора для каждого животного, а в файле животных мы использовали идентификатор в качестве внешнего ключа для ссылки на комментарии к животным.

Например, у нас есть bird.xml, подобный этому

    <?xml version="1.0" encoding="utf-8"?>
<Animals>
  <Animal ID="1">
    <Name>Jack Sparrow</Name>
  </Animal>
  <Animal ID="2">
    <Name>Black Hawk</Name>
  </Animal >
</Animals>

Тогда файл animalcomments.xml должен быть таким:

<?xml version="1.0" encoding="utf-8"?>
<Animals>
  <Animal ID="1">
    <Comments>
      <Comment CommentID="1">
        <Content>Hello world</Content>
      </Comment>
      <Comment CommentID="2">
        <Content>Hello world 2</Content>
      </Comment>
    </Comments>
  </Animal>
  <Animal ID="2">
    <Comments>
      <Comment CommentID="1">
        <Content>Hello world</Content>
      </Comment>
      <Comment CommentID="2">
        <Content>Hello world 2</Content>
      </Comment>
    </Comments>
  </Animal>  
</Animals>

Таким образом, вы можете сгенерировать код на основе этой структуры данных, считывая и записывая в каждый элемент файла animalcomments.xml.

2

В случае сбоя приложения я бы хотел этот же XML файл (AnimalComments.xml) для предварительно заполнить все комментарии, которые я введено до сбоя моего приложения.

В вашем

HandleUnhandledException ()

метод, сохраняющий все ваши комментарии перед прекращением работы программы. После перезагрузки программы вы можете получить все свои комментарии обратно.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...