Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «Ѐилософия Java3Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 111

Автор Π‘Ρ€ΡŽΡ ЭккСль

БСриализация ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌ Java-Bean. Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ ΠΎ состоянии Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ измСняСтся Π²ΠΎ врСмя Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. Π­Ρ‚Ρƒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ состоянии Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ, Π° Π·Π°Ρ‚Π΅ΠΌ, ΠΏΡ€ΠΈ запускС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ; Π΄Π°Π½Π½ΡƒΡŽ Π·Π°Π΄Π°Ρ‡Ρƒ Ρ€Π΅ΡˆΠ°Π΅Ρ‚ сСриализация ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ².

Π‘Π΅Ρ€ΠΈΠ°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ достаточно просто, Ссли ΠΎΠ½ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ интСрфСйс Seri-alizable (это интСрфСйс для самоидСнтификации, Π² Π½Π΅ΠΌ Π½Π΅Ρ‚ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°). Когда Π² язык Π±Ρ‹Π» Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ сСриализации, Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ классы стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ внСсли измСнСния Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ ΠΊ сСриализации. К Ρ‚Π°ΠΊΠΈΠΌ классам относятся всС классы-ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ для ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΡ… Ρ‚ΠΈΠΏΠΎΠ², всС классы ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² ΠΈ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅. Π”Π°ΠΆΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Class, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ классы, ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΅Ρ€ΠΈΠ°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ.

Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠ΅Ρ€ΠΈΠ°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, трСбуСтся ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Output-Stream, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½ΡƒΠΆΠ½ΠΎ Π²Π»ΠΎΠΆΠΈΡ‚ΡŒ Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ObjectOutputStream. По сути, Π²Ρ‹Π·ΠΎΠ² ΠΌΠ΅Ρ‚ΠΎΠ΄Π° writeObject() осущСствляСт ΡΠ΅Ρ€ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΈ Π΄Π°Π»Π΅Π΅ Π²Ρ‹ пСрСсылаСтС Π΅Π³ΠΎ Π² Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π΄Π°Π½Π½Ρ‹Ρ… OutputStream. Для восстановлСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π½Π°Π΄ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ObjectlnputStream для Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° InputStream, Π° Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ readObject(). Как ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ, Ρ‚Π°ΠΊΠΎΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ссылку Π½Π° ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Object, поэтому послС Π²Ρ‹Π·ΠΎΠ²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° слСдуСт провСсти нисходящСС ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ для получСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°.

БСриализация ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² проводится достаточно Ρ€Π°Π·ΡƒΠΌΠ½ΠΎ ΠΈ Π² ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΈ ссылок, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΡ…ΡΡ Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅. БохраняСтся Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ сам ΠΎΠ±Ρ€Π°Π· ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Π½ΠΎ ΠΈ всС связанныС с Π½ΠΈΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, всС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π² связанных ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°Ρ…, ΠΈ Ρ‚. Π΄. Π­Ρ‚ΠΎ часто Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ Β«ΠΏΠ°ΡƒΡ‚ΠΈΠ½ΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²Β», ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π° Ρ‚Π°ΠΊΠΆΠ΅ массив ссылок Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹-Ρ‡Π»Π΅Π½Ρ‹. Если Π±Ρ‹ Π²Ρ‹ создавали свой собствСнный ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ сСриализации, отслСТиваниС всСх ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°Ρ… ссылок стало Π±Ρ‹ вСсьма Π½Π΅Π»Π΅Π³ΠΊΠΎΠΉ Π·Π°Π΄Π°Ρ‡Π΅ΠΉ. Однако Π² Java Π½ΠΈΠΊΠ°ΠΊΠΈΡ… трудностСй со ссылками Π½Π΅Ρ‚ β€” судя ΠΏΠΎ всСму, Π² этот язык встроСн достаточно эффСктивный Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ создания Π³Ρ€Π°Ρ„ΠΎΠ² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ провСряСт ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ сСриализации: ΠΌΡ‹ создаСм Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ связанных ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… связан со ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ сСгмСнтом Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ массив ссылок Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ класса с ΠΈΠΌΠ΅Π½Π΅ΠΌ Data:

// io/Worm java

// ВСст сСриализации ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²

import java.io.*;

import java util *;

import static net mindview util.Print.*;

class Data implements Serializable { private int n;

public Data(int n) { this n = n, }

public String toStringO { return Integer toString(n); }

}

public class Worm implements Serializable {

private static Random rand = new Random(47); private Data[] d = {

new Data(rand.nextlnt(10)). new Data(rand nextlnt(lO)), new Data(rand nextlnt(lO))

}.

private Worm next.

private char с. ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅ &

// Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ i == количСство сСгмСнтов public Worm(int i, char x) {

print("ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ Worm- " + i); с = x, if(--i > 0)

next = new Worm(i, (char)(x +1)),

}

public WormO {

print("ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ"),

}

public String toStringO {

StringBuilder result = new StringBuilderCβ€’"); result.append(c), result.append("("); for(Data dat : d)

result.append(dat); result. appendC')"); if(next != null)

result.append(next), return result toStringO,

}

public static void main(String[] args) throws ClassNotFoundException, IOException { Worm w = new Worm(6, 'a'); printCw = " + w);

ObjectOutputStream out = new ObjectOutputStream(

new FileOutputStream("worm.out")); out writeObjectCWorm storage\n"), out.writeObject(w);

out closeO; // Π’Π°ΠΊΠΆΠ΅ очистка Π±ΡƒΡ„Π΅Ρ€Π° Π²Ρ‹Π²ΠΎΠ΄Π° Object InputStream in = new ObjectlnputStrearrK

new FileInputStream("worm.out")), String s = (String)in.readObjectO, Worm w2 = (Worm)in.readObjectO. print(s + β€’ "w2 = " + w2); ByteArrayOutputStream bout =

new ByteArrayOutputStream(); ObjectOutputStream out2 = new ObjectOutputStream(bout); out2.writeObject("ΠŸΠ°ΠΌΡΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Worm\n"); out2.write0bject(w); out2.flush();

ObjectInputStream in2 = new ObjectInputStream( new ByteArrayInputStream(bout toByteArrayO)); s = (String)in2 readObject(); Worm w3 = (Worm)in2.read0bject(); print(s + "w3 = " + w3);

}

} /* Output: ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ Worm- 6 ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ Worm. 5 ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ Worm- 4 ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ Worm. 3 ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ Worm: 2 ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ Worm: 1

w = :a(853) b(119).c(802) d(788) e(199):f(881) ΠŸΠ°ΠΌΡΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Worm

w2 = .a(853):b(119)-c(802)-d(788)-e(199)-f(881) ΠŸΠ°ΠΌΡΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Worm

w3 - :а(853):b(119):с(802):d(788):С(199):f(881)

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π±Ρ‹Π» интСрСснСС, массив ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Data Π² классС Worm инициализируСтся случайными числами. (Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, нСльзя Π·Π°ΠΏΠΎΠ΄ΠΎΠ·Ρ€ΠΈΡ‚ΡŒ компилятор Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ для хранСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ².) ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Worm помСчаСтся порядковым Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ-символом (char), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ автоматичСски гСнСрируСтся Π² процСссС рСкурсивного формирования связанной Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Worm. ΠŸΡ€ΠΈ создании Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ Π΅Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ€ указываСтся Π² конструкторС класса Worm. Для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ссылки next рСкурсивно вызываСтся конструктор класса Worm, ΠΎΠ΄Π½Π°ΠΊΠΎ с ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ Ρ€Π°Π·ΠΎΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ΡΡ Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ. Π’ послСднСм сСгмСнтС Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ ссылка next остаСтся со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ null, Ρ‡Ρ‚ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° ΠΊΠΎΠ½Π΅Ρ† Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ.

ВсС это дСлалось лишь ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΉ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅: для создания Π±ΠΎΠ»Π΅Π΅ ΠΈΠ»ΠΈ ΠΌΠ΅Π½Π΅Π΅ слоТной структуры, которая Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ сСриализована Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ. Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, сам Π°ΠΊΡ‚ сСриализации ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ ΠΏΡ€ΠΎΡ‰Π΅ простого. ПослС создания ΠΏΠΎΡ‚ΠΎΠΊΠ° ObjectOutputStream (Π½Π° основС Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°), ΠΌΠ΅Ρ‚ΠΎΠ΄ write-Object() записываСт Π² Π½Π΅Π³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π² ΠΏΠΎΡ‚ΠΎΠΊ Ρ‚Π°ΠΊΠΆΠ΅ записываСтся строка (String). Π’ этот ΠΆΠ΅ ΠΏΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ всС ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ‚Π΅ ΠΆΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, Ρ‡Ρ‚ΠΎ ΠΈ Π² классС DataOutputStream (ΠΎΠ±Π° ΠΏΠΎΡ‚ΠΎΠΊΠ° Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΉ интСрфСйс).

Π’ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π΅ΡΡ‚ΡŒ Π΄Π²Π° ΠΏΠΎΡ…ΠΎΠΆΠΈΡ… Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π° ΠΊΠΎΠ΄Π°. Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΌ запись ΠΈ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ производится Π² Ρ„Π°ΠΉΠ», Π° Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ для разнообразия Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ΠΌ слуТит массив Π±Π°ΠΉΡ‚ΠΎΠ² ByteArray. Π§Ρ‚Π΅Π½ΠΈΠ΅ ΠΈ запись ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² посрСдством сСриализации Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π° Π² Π»ΡŽΠ±Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ, Π² Ρ‚ΠΎΠΌ числС ΠΈ Π² сСтСвыС соСдинСния.

Из Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ восстановлСнный ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² самом Π΄Π΅Π»Π΅ содСрТит всС ссылки, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ Π² исходном ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅.

Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π² процСссС восстановлСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰Π΅Π³ΠΎ интСрфСйс Serializable, Π½ΠΈΠΊΠ°ΠΊΠΈΠ΅ конструкторы (Π΄Π°ΠΆΠ΅ конструктор ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ) Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ. ΠžΠ±ΡŠΠ΅ΠΊΡ‚ восстанавливаСтся Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ ΠΈ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΈΠ· Π΄Π°Π½Π½Ρ‹Ρ…, считанных ΠΈΠ· Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° InputStream.

ΠžΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ класса

Π’Π°ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ интСрСсно, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ для восстановлСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° послС провСдСния сСриализации. НапримСр, ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ создали ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, сС-Ρ€ΠΈΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π»ΠΈ Π΅Π³ΠΎ ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΠ»ΠΈ Π² Π²ΠΈΠ΄Π΅ Ρ„Π°ΠΉΠ»Π° ΠΈΠ»ΠΈ Ρ‡Π΅Ρ€Π΅Π· сСтСвоС соСдинСниС Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€. Π‘ΡƒΠΌΠ΅Π΅Ρ‚ Π»ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΌ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅ Ρ€Π΅ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΎΠΏΠΈΡ€Π°ΡΡΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° Ρ‚Π΅ Π΄Π°Π½Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ записаны Π² Ρ„Π°ΠΉΠ» Π² процСссС сСриализации?

Π‘Π°ΠΌΡ‹ΠΉ Π½Π°Π΄Π΅ΠΆΠ½Ρ‹ΠΉ способ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΎΡ‚Π²Π΅Ρ‚ Π½Π° этот вопрос β€” провСсти экспСримСнт. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ„Π°ΠΉΠ» располагаСтся Π² ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ Π΄Π°Π½Π½ΠΎΠΉ Π³Π»Π°Π²Ρ‹:

//: io/Alien java

// Π‘Π΅Ρ€ΠΈΠ°Π»ΠΈΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ класс

import java.io.*;

public class Alien implements Serializable {} ///:-

Π€Π°ΠΉΠ» с ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ, ΡΠΎΠ·Π΄Π°ΡŽΡ‰Π΅ΠΉ ΠΈ ΡΠ΅Ρ€ΠΈΠ°Π»ΠΈΠ·ΡƒΡŽΡ‰Π΅ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Alien, находится Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅:

// io/FreezeAlien java

// Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π° с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ сСриализации

import java io *,

public class FreezeAlien {

public static void main(Stnng[] args) throws Exception { ObjectOutput out = new ObjectOutputStream( new FileOutputStreamC'X file")). Alien quellek = new AlienO. out writeObject(quellek),

}

} III ~

ВмСсто Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΈΠ΄Π΅Ρ‚ ΠΏΠΎ простому ΠΏΡƒΡ‚ΠΈ β€” ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ main(), поэтому сообщСния ΠΎ Π½ΠΈΡ… Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹Π΄Π°Π²Π°Ρ‚ΡŒΡΡ Π½Π° консоль.

ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ Π²Ρ‹ скомпилируСтС ΠΈ запуститС этот ΠΊΠΎΠ΄, Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ с12 появится Ρ„Π°ΠΉΠ» с ΠΈΠΌΠ΅Π½Π΅ΠΌ X.file. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° скрыта ΠΎΡ‚ Ρ‡ΡƒΠΆΠΈΡ… Π³Π»Π°Π· Π² «сСкрСтном» ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ xfiles:

//β€’ io/xfi1es/ThawAlien java

// ΠŸΠΎΠΏΡ‹Ρ‚ΠΊΠ° восстановлСния сСриализованного Ρ„Π°ΠΉΠ»Π°

// Π±Π΅Π· сохранСния класса ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π² Π·Ρ‚ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅.

// {RunByHand}

import java io *,

public class ThawAlien {

public static void main(Strmg[] args) throws Exception { ObjectInputStream in = new ObjectInputStream(

new FileInputStream(new FileC. ". "X file"))). Object mystery = in readObjectO, System out println(mystery getClassO),

}

} /* Output

class Alien */// -

Π”Π°ΠΆΠ΅ ΠΎΡ‚ΠΊΡ€Ρ‹Π² Ρ„Π°ΠΉΠ» ΠΈ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π² ΠΈΠ· Π½Π΅Π³ΠΎ Π΄Π°Π½Π½Ρ‹Π΅ для восстановлСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° mystery, Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ машина Java QVM) Π½Π΅ смоТСт Π½Π°ΠΉΡ‚ΠΈ Ρ„Π°ΠΉΠ» Alien.class; ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Class для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Alien Π±ΡƒΠ΄Π΅Ρ‚ Π² Π½Π΅ досягаСмости (Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΡΠΎΠ·Π½Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π΅ рассматриваСтся Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ обнаруТСния Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ окруТСния CLASSPATH). Π’ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ClassNotFoundException.

Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ сСриализациСй

Как Π²Ρ‹ ΠΌΠΎΠ³Π»ΠΈ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, стандартный ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ сСриализации достаточно прост Π² ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ. Но Ρ‡Ρ‚ΠΎ, Ссли Ρƒ вас Π²ΠΎΠ·Π½ΠΈΠΊΠ»ΠΈ особыС трСбования? Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΈΠ· сообраТСний бСзопасности Π²Ρ‹ Π½Π΅ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ части вашСго ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΈΠ»ΠΈ ΡΠ΅Ρ€ΠΈΠ°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, содСрТащийся Π² Π³Π»Π°Π²Π½ΠΎΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅, Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ смысла, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ погодя Π΅Π³ΠΎ всС Ρ€Π°Π²Π½ΠΎ потрСбуСтся ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π·Π°Π½ΠΎΠ²ΠΎ.

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ процСссом сСриализации, рСализуя Π² своСм классС интСрфСйс Externalizable вмСсто интСрфСйса Serializable. Π­Ρ‚ΠΎΡ‚ интСрфСйс Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅Ρ‚ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ интСрфСйс Serializable ΠΈ добавляСт Π² Π½Π΅Π³ΠΎ Π΄Π²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, writeExternal() ΠΈ readExternal(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ автоматичСски Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π² процСссС сСриализации ΠΈ восстановлСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², позволяя Π²Π°ΠΌ ΠΏΠΎΠΏΡƒΡ‚Π½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ спСцифичСскиС дСйствия для ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ продСмонстрирована простая рСализация интСрфСйса Externalizable. Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅, Ρ‡Ρ‚ΠΎ классы Blipl ΠΈ Blip2 практичСски ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹, Ссли Π½Π΅ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΌΠ°Π»ΠΎΠ·Π°ΠΌΠ΅Ρ‚Π½ΠΎΠ³ΠΎ отличия:

// io/Blips.java

// ΠŸΡ€ΠΎΡΡ‚Π°Ρ рСализация интСрфСйса Externalizable. . с ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ

import java io *;

import static net mindview util Print *;

class Blipl implements Externalizable {

public BliplO {

print("ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ Blipl"),

}

public void writeExternal(ObjectOutput out) throws IOException { print("Blipl writeExternal"),

}

public void readExternal(Objectlnput in)