Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с файлами 
:(
    Опции темы
stron
  Дата 23.4.2004, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Консультант
***


Профиль
Группа: Комодератор
Сообщений: 1654
Регистрация: 17.7.2003
Где: Питер

Репутация: 4
Всего: 36



А как писать в файл свои типы?
Напр., у меня тип состоит из нескольких статических массивов.



--------------------
подписи нет
PM ICQ   Вверх
Kurt
Дата 24.4.2004, 02:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлеченный
***


Профиль
Группа: Участник Клуба
Сообщений: 1662
Регистрация: 22.8.2003
Где: Краснодар

Репутация: 20
Всего: 36



Хм.. Уж не сериализация ли тебе нужна?
Если, так то ниже следует пример как это все использовать.
Пример готов к компиляции. smile.gif
Существет два "способа" сериализации (в кавычках, т.к. речь идет о формате записи..) - в двоичном формате и формате SOAP. Можно реализовать свой формат, но, ИМХО, и этого хватает. В общем, что в примере:
Я создал свой класс (MyClass), к-й и буду писать в файл. Это мой тип. smile.gif
Там я определил пару полей, показал private, public и массив (строки). В принципе, без разницы, что за поля/методы у класса. Надеюсь, код получился вполне читаемый:
Код
using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

[Serializable] //вот ОНО! самое важное!
public class MyClass //класс, к-й мы будем писать в файл
{
private int i;
public string[] Strings;

public int I //создали проперти
{
 get
 {
  return this.i;
 }
 set
 {
  this.i = value;
 }
}

public MyClass() //конструктор. :)
{
 this.i=1;
 Strings = new string[2]{"Hi!","That's all!"};
 return;
}
}

public class Test //класс, к-й демонстрирует работу всего этого дела
{
public static void Main()
{
 MyClass objectOfMyClass = new MyClass();
 objectOfMyClass.I=7; //чтоб не по умолчанию. :)

 Console.WriteLine("Before writing to file:");
 Console.WriteLine("I="+objectOfMyClass.I);

Console.WriteLine("Strings: \""+objectOfMyClass.Strings[0]+"\" \""+objectOfMyClass.Strings[1]+"\"");  //это одна строка - просто не поместилась
 Console.WriteLine("Writing to file..");

// запишем объект в файл
 FileStream stream = File.Create("SomeFile.dat"); //создаем поток

 BinaryFormatter formatr = new BinaryFormatter(); //создаем форматер для записи/чтения нашего класса. Используется двоичный способ.

 formatr.Serialize(stream, objectOfMyClass); //это "запись" объекта в файл
 stream.Close();

 Console.WriteLine("Done.");
 Console.WriteLine("Reading from file..");

// а теперь прочитаем что написали
 stream = File.OpenRead("SomeFile.dat");
 MyClass GotClass = (MyClass)formatr.Deserialize(stream); //"чтение " объекта из файла.
 stream.Close();
 Console.WriteLine("Done.");
 Console.WriteLine("Read from file:");
//показываем что в прочитанном класе
 Console.WriteLine("I="+GotClass.I);
 Console.WriteLine("Strings: \""+GotClass.Strings[0]+"\"  \""+GotClass.Strings[1]+"\"");  
 Console.Read();
 
 return;
}
}


Все. Похоже? Или не то спрашивал?..

P.S. Если некоторые поля в классе константы, то их можно не сериализовать - зачем файл увеличивать? Для этого перед таким полем ставим:
Код
[NonSerialized]
int j=5;


Это сообщение отредактировал(а) Kurt - 24.4.2004, 02:36


--------------------
Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед)
...
Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн)
PM ICQ   Вверх
stron
Дата 25.4.2004, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Консультант
***


Профиль
Группа: Комодератор
Сообщений: 1654
Регистрация: 17.7.2003
Где: Питер

Репутация: 4
Всего: 36



Спасибо за помощь. smile.gif

Реализовал так:

Код

using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
............................
............................

[Serializable]
class Mytype
{
public int param1=1;
public int param2=2;
public Image[] param3=new Image[2];

public void save()
{    
 FileStream fs = new FileStream("data.dat",FileMode.Create);
 BinaryFormatter bf = new BinaryFormatter();
 bf.Serialize(fs,this);
 fs.Close( );      
 return;  
}
 
public Mytype load()
{
 FileStream fs = new FileStream("data.dat",FileMode.Open);
 BinaryFormatter bf = new BinaryFormatter( );
 Mytype myobj = (Mytype) bf.Deserialize(fs);
 fs.Close();  
 return myobj;
}
}

...................................
...................................




Код

.........................................
Mytype d = new Mytype();
.........................................
//Загружаем так:
d=d.load();
.........................................
//А сохраняем так:
d.save();
.........................................



--------------------
подписи нет
PM ICQ   Вверх
Kurt
Дата 25.4.2004, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлеченный
***


Профиль
Группа: Участник Клуба
Сообщений: 1662
Регистрация: 22.8.2003
Где: Краснодар

Репутация: 20
Всего: 36



Без проблем.
Всегда рад. smile.gif


--------------------
Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед)
...
Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн)
PM ICQ   Вверх
medos
Дата 20.5.2006, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 20.12.2005

Репутация: нет
Всего: нет



Цитата

Код

using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
............................
............................

[Serializable]
class Mytype
{
    public int param1=1;
    public int param2=2;
    public Image[] param3=new Image[2]; 
    
    public void save()
    {       
  FileStream fs = new FileStream("data.dat",FileMode.Create);
  BinaryFormatter bf = new BinaryFormatter();
  bf.Serialize(fs,this);
  fs.Close( );      
  return;   
    }
  
    public Mytype load()
    {
  FileStream fs = new FileStream("data.dat",FileMode.Open);
  BinaryFormatter bf = new BinaryFormatter( );
  Mytype myobj = (Mytype) bf.Deserialize(fs);
  fs.Close();  
  return myobj;
    }   
}

...................................
...................................


Код

Mytype d = new Mytype(); 
.........................................
//Загружаем так:
d=d.load();
.........................................
//А сохраняем так:
d.save();




У меня похожая задача, что и у строн, только мне надо сохранить не объект, а массив объектов (двумерный).

Подскажите пожалуйста как.  smile  
PM MAIL   Вверх
Ch0bits
Дата 20.5.2006, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Python Dev.
****


Профиль
Группа: Завсегдатай
Сообщений: 2124
Регистрация: 21.2.2005
Где: Казань

Репутация: 9
Всего: 62



medos
Просто добавляешь в класс Mytype свой массив.
Например двумерный массив типа int задаётся так:
Код

public int[,] Array2D = new int[100, 100];
 
PM WWW   Вверх
medos
Дата 20.5.2006, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 20.12.2005

Репутация: нет
Всего: нет



Дело в том, что каждый элемент массива представляет собой не число, а отдельный объект, над которым будут выполняться действия по ходу работы программы.

Можно конечно записать массив в класс, но непонятно как после этого работать с этим массивом?

Или все-таки как-нибудь можно выполнить сериализацию этих объектов по отдельности? 
PM MAIL   Вверх
Ch0bits
Дата 20.5.2006, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Python Dev.
****


Профиль
Группа: Завсегдатай
Сообщений: 2124
Регистрация: 21.2.2005
Где: Казань

Репутация: 9
Всего: 62



medos
Точно также можно включить и массив объектов, только они должны поддерживать сериализацию, т.е. наследовать интерфейс ISerializable. 
PM WWW   Вверх
medos
Дата 20.5.2006, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 20.12.2005

Репутация: нет
Всего: нет



Имеется клас A,  в классе имеется переменная b типа int, и массив c[n] типа int. Cвойства для переменной b легко установить с помощью методов set и get. Тогда к переменной b можно будет обращаться так:

а.b

Но как сделать так, чтобы обращаться к массиву с в виде а.с[i]? 
PM MAIL   Вверх
VisualProgrammerNET
Дата 21.5.2006, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Почётный халявщик
**


Профиль
Группа: Участник
Сообщений: 461
Регистрация: 30.10.2005
Где: Зеленоград

Репутация: 4
Всего: 6



Насколько я понял... речь идёт об этом:
Код

public class A
{
const int n = 30;
public int[] c = new int[n];
}

Цитата(medos @  20.5.2006,  19:33 Найти цитируемый пост)
Но как сделать так, чтобы обращаться к массиву с в виде а.с[i]?


Эээ... 
Вариант 1 (для умных): Создать объект типа А. A a = new A(); a.c[0] = 1;

Вариант 2 (для очень умных): Переделать public поле в static. 

Только я вот не помню, статические поля тоже сериализуются?  smile 
 


--------------------
3 ГОДА НА user posted image 
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0489 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.