Sarjallistaminen Juha Järvensivu juha.jarvensivu@tut.fi 2007
Sisällys 1. tunti: Sarjallistaminen.NET ympäristössä 2. tunti: Sarjallistaminen Java ympäristöstä
Sarjallistaminen Muutetaan objektin tila muotoon, jossa se voidaan tallettaa tiedostoon, leikepöydälle tai siirtä verkon yli toiselle koneelle
Sarjallistaminen Serialization Olioiden kirjoittamista tulosvirtaan (tiedostoon) DeSerialization Olioiden lukemista virrasta (tiedostosta)
.NET-sarjallistaminen System.IO System.Runtime.Serialization System.Runtime.Serialization.Formatters.Binary
System.IO FileSystemInfo Tiedostoille ja hakemistoille yhteiset operaatiot long CreationTime long LastAccessTime FileInfo Tiedoston käsittelyyn tarvittavat operaatio CopyTo(string destfile) MoveTo(string destfile) Delete() DirectoryInfo Hakemistojen käsittelyyn tarvittavat operaatiot CreateDirectory(string path) GetDirectories() GetFiles()
System.IO File Vastaavat metodit kuin FileInfo-luokalla Metodit toteutettu staattisina metodeina Yksittäiselle operaatiolle nopeampia Directory Vastaavat metodit kuin DirectoryInfo luokalla
Binäärimuotoinen sarjallistaminen Tallettaa oliot tiedostoon binäärimuodossa Tehokas Tiedoston sisältö ei muiden ohjelmien ymmärtämässä muodossa
Serialize attribute Jokainen sarjallistuva luokka pitää merkata määreelllä [Serializable()] Yksittäinen kenttä voidaan ohittaa kirjoittamalla sen eteen määre [NonSerialized()]
Sarjallistuva luokka // A test object that needs to be serialized. [Serializable()] public class TestObject { public int member1; public string member2; public string member3; public double member4; // A field that is not serialized. [NonSerialized()] public string member5; } public TestObject() { }
Binääritiedostoon kirjoittaminen // Luodaan sarjallistettava olio TestObject obj = new TestObject(); TestObject obj2 = new TestObject(); // Luodaan tietovirtaolio FileStream fs = new FileStream(filename,FileMode.Create); // Sarjallistetaan binäärimuodossa BinaryFormatter f = new BinaryFormatter(); // Kirjoitetaan data levylle f.serialize(fs,obj); f.serialize(fs,obj2); // Suljetaan tietovirta fs.close();
Binääritiedostosta lukeminen // Luodaan tietovirta ja formatter-olio FileStream fs = new FileStream(filename,FileMode.Open); BinaryFormatter formatter = new BinaryFormatter(); // Luetaan oliot samassa järjestyksessä kuin ne on // virtaan kirjoitettu obj1 = (TestObject)formatter.Deserialize(fs); obj2 = (TestObject)formatter.Deserialize(fs); // Suljetaan tietovirta fs.close();
Muistiin sarjallistaminen byte[] buffer; // Oliot sarjallistetaan muistivirtaan MemoryStream memstream = new MemoryStream(); IFormatter binaryformatter = new BinaryFormatter(); binaryformatter.serialize(memstream,obj1); binaryformatter.serialize(memstream,obj2); // Tallennetaan data byte-taulukkoon buffer = memstream.getbuffer(); memstream.close();
Muistiin sarjallistaminen byte[] buffer; MemoryStream memstream = new MemoryStream(buffer); IFormatter bf = new BinaryFormatter(); obj1 = (TestObject ) bf.deserialize(memstream); obj2 = (TestObject ) bf.deserialize(memstream); memstream.close();
Taulukon sarjallistaminen Myös taulukon sisällön voi sarjallistaa kunhan kaikki taulukossa olevat oliot on määritelty sarjallistuviksi! ArrayList alist = new ArrayList(); alist.add(obj1); alist.add(obj2); MemoryStream memstream = new MemoryStream(); IFormatter binaryformatter = new BinaryFormatter(); binaryformatter.serialize(memstream,alist);
SerializationException
OpenFileDialog System.Windows.Forms.OpenFileDialog
OpenFileDialog // Luodaan dialogi OpenFileDialog openfiledialog1 = new OpenFileDialog(); // Asetetaan hakemisto, johon dialogi oletuksena avataan openfiledialog1.initialdirectory = "c:\\" ; // Määritetään hyväksytyt tiedostotyyppi openfiledialog1.filter = "txt files (*.txt) *.txt All files (*.*) *.*" ; // Oletustiedostotyyppi openfiledialog1.filterindex = 2; // Avataan dialogi käyttäjälle if(openfiledialog1.showdialog() == DialogResult.OK) { }
SaveFileDialog System.Windows.Forms.SaveFileDialog
SaveFileDialog // Luodaan dialogi SaveFileDialog savefiledialog1 = new SaveFileDialog(); // Asetetaan hakemisto, johon dialogi oletuksena avataan savefiledialog1.initialdirectory = "c:\\" ; // Määritetään hyväksytyt tiedostotyyppi savefiledialog1.filter = "txt files (*.txt) *.txt All files (*.*) *.*" ; // Oletustiedostotyyppi savefiledialog1.filterindex = 2; // Avataan dialogi käyttäjälle if(savefiledialog1.showdialog() == DialogResult.OK) { }
FileDialog.Filter Määrittää tiedostodialogin hyväksymät tiedostotyypit Text files (*.txt) *.txt All files (*.*) *.*" Image Files(*.BMP;*.JPG;*.GIF) *.BMP;*.JPG;*.GIF All files (*.*) *.*
FolderBrowserDialog System.Windows.Form.FolderBrowserDial og Dialogi hakemiston valintaan
Esimerkki.NET
Sisällys 1. tunti: Sarjallistaminen.NET ympäristössä 2. tunti: Sarjallistaminen Java ympäristöstä
Java sarjallistaminen Java.IO File FileInputStream FileOutputStream ObjectInputStream ObjectOutputStream
System.IO.File boolean isdirectory() long lastmodified() long length() Tiedoston koko Hakemiston kohdalla määrittelemätön File[] listfiles() Palauttaa null, jos kyseessä on tiedosto
Interface Serializable Kaikkien sarjallistuvien luokkien tulee toteuttaa Serializable rajapinta public class DataItem implements Serializable { string name; int value; }
FileInputStream / FileOutputStream Java.IO.FileInputStream read(byte[]) Java.IO.FileOutputStream write(byte[])
ObjectInputStream / ObjectOutputStream Java.IO.ObjectInputStream ObjectreadObject() intreadint() Java.IO.ObjectOutputStream writeobject(object obj) writeint(int value)
Sarjallistuva luokka public class TestObject implements Serializable { private String data; private int number; } public TestObject() { }
TestObject obj1 = new TestObject(); TestObject obj2 = new TestObject(); Binääritiedostoon kirjoittaminen FileOutputStream out = new FileOutputStream(FILE_NAME); ObjectOutputStream s = new ObjectOutputStream(out); // Kokonaisluvun tallentaminen s.writeint(2); // Olion tallentaminen s.writeobject(obj1); s.writeobject(obj2); // Virtojen sulkeminen s.flush(); out.close();
Binääritiedostosta lukeminen FileInputStream input = new FileInputStream(FILE_NAME); ObjectInputStream s = new ObjectInputStream(input); // Kokonaisluvun lukeminen int count = s.readint(); // Virtaan tallennettujen objektien lukeminen obj1 = s.readobject(); obj2 = s.readobject(); // Tietovirran sulkeminen input.close();
JFileChooser
OpenFileDialog JFileChooser fc = new JFileChooser(); fc.setfileselectionmode(jfilechooser.files_and DIRECTORIES); int retval = fc.showopendialog(); /*int retval = fc.showsavedialog();*/ File file = fc.getselectedfile();
Esimerkki
Lähteet System.IO.FileSystemInfo http://msdn.microsoft.com/library/default.asp?url=/library/enus/cpref/html/frlrfsystemiofilesysteminfoclasstopic.asp System.IO.DirectoryInfo http://msdn.microsoft.com/library/default.asp?url=/library/enus/cpref/html/frlrfsystemiodirectoryinfoclasstopic.asp System.IO.FileInfo http://msdn.microsoft.com/library/default.asp?url=/library/enus/cpref/html/frlrfsystemiofileinfoclasstopic.asp System.IO.File http://msdn.microsoft.com/library/default.asp?url=/library/enus/cpref/html/frlrfsystemiofileclasstopic.asp System.IO.Directory http://msdn.microsoft.com/library/default.asp?url=/library/enus/cpref/html/frlrfsystemiodirectoryclasstopic.asp
Lähteet OpenFileDialog http://msdn.microsoft.com/library/default.asp?url=/library/enus/cpref/html/frlrfsystemwindowsformsopenfiledialogclasstopic.asp SaveFileDialog http://msdn.microsoft.com/library/default.asp?url=/library/enus/cpref/html/frlrfsystemwindowsformssavefiledialogclasstopic.asp FolderBrowserDialog http://msdn.microsoft.com/library/default.asp?url=/library/enus/cpref/html/frlrfsystemwindowsformsfolderbrowserdialogclasstopic.asp Java sarjallistaminen http://java.sun.com/docs/books/tutorial/essential/io/serialization.html Java.IO.File http://java.sun.com/j2se/1.4.2/docs/api/java/io/file.html