Типизированные файлы в С#

Тема в разделе ".NET", создана пользователем Visor_ck, 9 янв 2007.

Статус темы:
Закрыта.
  1. Visor_ck

    Visor_ck Гость

    Всем доброго времени суток.

    У меня такой вопрос: как в C# работать с типизированными файлами ?

    Например:

    у меня есть струтура

    public struct sAddress
    {
    public string City;
    public string District;
    public string Street;
    public string ZipCode;
    public string Phone;
    }

    как мне организовать запись а файл объектов такого типа ?

    P.S.
    Прошу сильно не пинать.
     
  2. Pasha

    Pasha Гость

    Полного аналога типизированных файлов в .net нет. Сохрнять/загружать объекты можно при поможи сериализации, примерно так:
    Код (Text):
    namespace Sample
    {
    [Serializable()]
    public struct Address
    {
    public string City;
    public string District;
    public string Street;
    public string ZipCode;
    public string Phone;
    }

    class Program
    {
    static void Main(string[] args)
    {
    string filename = "test.dat";
    Address[] adressesToSave = new Address[5];

    // заполняем данными
    adressesToSave[0].City = "Minsk";
    // ....
    adressesToSave[1].City = "Brest";
    // ....

    BinaryFormatter formatter = new BinaryFormatter();

    FileStream outputStream = File.OpenWrite(filename);
    formatter.Serialize(outputStream, adressesToSave);
    outputStream.Close();

    FileStream inputStream = File.OpenRead(filename);
    Address[] loadedAddresses = (Address[])formatter.Deserialize(inputStream);
    inputStream.Close();
    }
    }
    }
    Если надо сохранять в более "читабельном" формате, без привязки к конкретному приложению - используй xml-сериализацию.
     
  3. Netizen

    Netizen Гость

    Вопрос по сериализации: как можно правильно сериализовать сложный класс, т.е. содержащий экземпляр другого класса, ведь при обычном методе компилятор матерится. Если из него убрать эти экземпляры и оставить только переменные стандартных типов (string, boolean, integer и т.д.), то все работает нормально. Заранее благодарен. :)
     
  4. Sunrise

    Sunrise Гость

    Для: Netizen
    Код (Text):
    [Serializable]
    class Foo
    {
    int a;
    int b;
    int c;
    }

    [Serializable]
    class Bar
    {
    Foo foo;
    int d;
    }

    class Program
    {
    static void Main(string[] args)
    {
    Bar bar = new Bar();
    FileStream stream = File.OpenWrite("1.dat");
    BinaryFormatter formatter = new BinaryFormatter();
    formatter.Serialize(stream, bar);
    }
    }
    Все работает... Может, у тебя не все классы имеют атрибут Serializable?
     
  5. Netizen

    Netizen Гость

    Для: Sunrise
    Скорее всего в этом и ошибка. Я не писал перед классами [Serializable]. Спасибо большое за помощь. :)
     
  6. Visor_ck

    Visor_ck Гость

    Большое спасибо :).

    Еще такой вопрос:
    если я таким образом записал в файл, на пример, 15 записей, как мне обратиться к записи на прямую, зная индекс. (не пребирая все предидущие)

    Заранее благодарен :)
     
  7. NikSoft

    NikSoft Гость

    Для: Visor_ck
    Пиши записи, например, в ArrayList, который сохраняй в файл.
    Считывай содержимое файла в ArrayList и обращайся к записи по известному тебе индексу.
     
  8. Visor_ck

    Visor_ck Гость

    Это не совсем то, что мне нужно :). при такой работе, если у меня будет довольно большой файл с зарисями (хотя бы метров 200), грузить в ArrayList оно будет очень долго.
    Я имел ввиду считывание из файла только одной записи, по известному индексу.
    Такое в Делфи примерно так делалось: seek(f, sizeof(мой_тип) * n) где f - файл n - номер записи.
    Ипользование БД для хранения не предлогать :). Задание стоит сделать все именно через файлы.
     
  9. Sunrise

    Sunrise Гость

    Для: Visor_ck
    Что, если не сериализовать, а сохранять в xml? То есть делать записи типа
    Код (Text):
    <Address>
    <Number>1</Number>
    <City>Minsk</City>
    ...
    <Phone>111111</Phone>
    </Address>
    А потом доставать из файла запись с нужным тебе значением Number.
     
  10. Visor_ck

    Visor_ck Гость

    Насчет XML думал, в принципе, вариант, но хочется все же с файлами разобраться.
     
  11. Pasha

    Pasha Гость

    Для: Sunrise
    Это не решает проблему загрузки всего файла в память перед его использованием. Да и сохранение в XML - это та же самая сериализация, только в другой формат.
    Для: Visor_ck
    В C# точного аналога sizeof для объекта нет, хотя бы потому, что ты не ограничиваешь длину string. И поэтому узнать смещение определенной записи в файле в приципе невозможно без перебора всех записей до нее.
    Есть вот примерно такие варианты:
    1. Сериализовать каждую запись отдельно в MemoryStream, в отдельный файл сохранять смещения всех записей - что-то вроде оглавления.
    2. Если сам формат файла не важен, попробуй использовать SQL Server 2005 Compact Edition. Это набор библиотек, позволяющий работать с файлом базы данных в формате sdf.
     
Загрузка...
Похожие Темы - Типизированные файлы С#
  1. lmike
    Ответов:
    27
    Просмотров:
    302
  2. garrick
    Ответов:
    25
    Просмотров:
    665
  3. sgfsdg
    Ответов:
    1
    Просмотров:
    432
  4. vovanabali
    Ответов:
    0
    Просмотров:
    541
  5. anatoliygorbunov
    Ответов:
    1
    Просмотров:
    774
Статус темы:
Закрыта.

Поделиться этой страницей