Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Работа с файлами


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

Автор: Kurt 24.4.2004, 02:35
Хм.. Уж не сериализация ли тебе нужна?
Если, так то ниже следует пример как это все использовать.
Пример готов к компиляции. 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;

Автор: stron 25.4.2004, 19:14
Спасибо за помощь. 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();
.........................................

Автор: Kurt 25.4.2004, 21:13
Без проблем.
Всегда рад. smile.gif

Автор: medos 20.5.2006, 13:25
Цитата

Код

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  

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

public int[,] Array2D = new int[100, 100];
 

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

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

Или все-таки как-нибудь можно выполнить сериализацию этих объектов по отдельности? 

Автор: Ch0bits 20.5.2006, 19:11
medos
Точно также можно включить и массив объектов, только они должны поддерживать сериализацию, т.е. наследовать интерфейс ISerializable. 

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

а.b

Но как сделать так, чтобы обращаться к массиву с в виде а.с[i]? 

Автор: VisualProgrammerNET 21.5.2006, 11:45
Насколько я понял... речь идёт об этом:
Код

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 
 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)