argon bulletin board

Експертно търсене  

Новини:

Регистрирането на нови потребители е временно деактивирано.

Автор Тема: Java - Serializaciq na neserializiruemi obekti  (Прочетена 3185 пъти)

JOKe

  • Неактивен Неактивен
  • Публикации: 2656
  • Code or Die
Java - Serializaciq na neserializiruemi obekti
« -: 26.11.2004, 21:16:00 »

Znachi   vaprosa e sledniq.

kak moga da serializiram obekti koito ne sa serializirani kato obektite v Java 2D api-to na SUN kato Line2D/Ellipse2D etc.

p.s. ako nikoi ne gi e sreshtal samo shte dobavq ceh vseki ot tezi obekti ima protected konstruktor i ima vytreshen class saotvetno Double i FLoat koito priemat double i float stoinosti i koito veche neznam moje bi se obrashtat kym na glavniq klas konstruktora neznam tochno.
vaprosa mi e moga li nqakak si da nasledq nqakoi ot tezi klasove kato mu implementiram serializable i da polzvam nego ? samo che dori da go napravq tova nenzam kak shte stoi mnomenta s vatreshntie clasove shte moje li da se napravi neshto kato super.Double(2,2,20,20); primerno
Активен

Nikolay Manchev

  • Неактивен Неактивен
  • Публикации: 185
    • http://www.manchev.org
Java - Serializaciq na neserializiruemi obekti
« Отговор #1 -: 27.11.2004, 11:50:00 »

Ооох. Не искам даже да знам какво правиш, та си затънал в такъв проблем. Нищо, другия път ще се научиш да си проектираш архитектурата навреме  

Така, не искам да питам защо ще сериализираш линии и елипси, да кажем, че си е твоя работа (не, наистина не искам да знам!)

Любопитно ми е, защо искаш да наследяваш Line2D. Мисли рационално - ако ти трябваше да можеш да боравиш с тоя клас и ако е нужно да го наследяваш, дали инженерите от Sun щяха да ти направят конструктора protected? То от тук като се замислиш само и става ясно, че правиш нещо нередно.

Ок, стига съм разправял какво не трябва да се прави, сега да ти кажа какво можеш да направиш. Първо, избираш си кой от двата наследника на Line2D (примерно) ти трябва, в зависимост от мащаба на координатите с които ще работиш (Double/Float). После си правиш едно класче ей така примерно:

public class SerializedLine2DFloat extends java.awt.geom.Line2D.Float imlpements java.io.Serializable {

...

}

и това си го инстанцираш както ти душа иска и си достъпваш методите локално.

Хайде със здраве и дерзай  
Активен

JOKe

  • Неактивен Неактивен
  • Публикации: 2656
  • Code or Die
Java - Serializaciq na neserializiruemi obekti
« Отговор #2 -: 27.11.2004, 16:13:00 »

m taka eto kakvo napavih :
public class SerializedLine2DFloat extends java.awt.geom.Line2D.Float imlpements java.io.Serializable {

public SerializedLine2DFloat(float a,float b,float c,float d){
super(a,b,c,d);
}

}

dotuk dobre sichko si raboti sled kato smenih nasqakade Line2D.Float s SerializedLine2DFloat ; otdelno veche ne mi dava i greshkata Line2D$Float  is not serializable object ili neshto takova;
no . kogato pisha v faila toi vinagi e goqlm 4096byte-a i vinagi e prazen enzavisimo kolko liniii blyskam v nego sled deserializaciq da go narechem nishto ne stava .
eto kvo pravq da ne bi da barkam neshto :
serializaciq :
ObjectOutputStream outWrite = new ObjectOutputStream(new FileOutputStream(myFile));
outWrite.writeObject(layers); //layers e ArrayList ot linii.

deserializaciq :
ObjectInputStream in = new ObjectInputStream(new FileInputStream(myFile));
layers = (ArrayList) in.readObject();
Активен

JOKe

  • Неактивен Неактивен
  • Публикации: 2656
  • Code or Die
Java - Serializaciq na neserializiruemi obekti
« Отговор #3 -: 27.11.2004, 16:45:00 »

a vsashnost naistina se zapisvat neshtata hm   obache sled kato deserializiram .. masiva naistina se napalva s 9 figuri ako predi tova sam imal 9 narisuvani ama neiska da gi risuva ...
Активен

Райчо Мукелов

  • Неактивен Неактивен
  • Публикации: 486
  • I snuggle with subwoofers
    • HULTIG - Human Language Technlogy and Bioinformatics Interest Group
Java - Serializaciq na neserializiruemi obekti
« Отговор #4 -: 27.11.2004, 20:09:00 »

А как точно имплементваш интерфейса java.io.Serializable ?

[This message has been edited by sasquatch (edited 27-11-2004).]
Активен

Nikolay Manchev

  • Неактивен Неактивен
  • Публикации: 185
    • http://www.manchev.org
Java - Serializaciq na neserializiruemi obekti
« Отговор #5 -: 29.11.2004, 08:56:00 »

Значи проблема ти не е във вход/изхода (щом си вдига нещата в масива).

sasquatch, ти как точно очакваш да имплемнтира празния интерфейс Serializable?  
Активен

Райчо Мукелов

  • Неактивен Неактивен
  • Публикации: 486
  • I snuggle with subwoofers
    • HULTIG - Human Language Technlogy and Bioinformatics Interest Group
Java - Serializaciq na neserializiruemi obekti
« Отговор #6 -: 29.11.2004, 10:37:00 »

Добре де обърках се щото съм чел между редовете, в документацията пише че за специални случаи се реализират методите:
private void writeObject(java.io.ObjectOutputStream out)
     throws IOException
private void readObject(java.io.ObjectInputStream in)
     throws IOException, ClassNotFoundException;
,а тоя случай не е такъв, просто исках да помогна. Тъй като си направих аналогия с C++ - там се налага сам да си реализираш метод които да сериализира и обратното (е не 100%, има обект който е stream и се подава като параметър пък и някои класове си го имат имплементиран метода), и като четох документацията ми се набиха в очите тея неща и съм изпуснал изобщо да прочета, че по принцип било достатъчно да се имплементе празния интерфейс от класа и да си остане празен и че това било просто начин да се покаже че класа може да се сериализира.

[This message has been edited by sasquatch (edited 29-11-2004).]
Активен

Nikolay Manchev

  • Неактивен Неактивен
  • Публикации: 185
    • http://www.manchev.org
Java - Serializaciq na neserializiruemi obekti
« Отговор #7 -: 29.11.2004, 11:00:00 »

sasquatch,

Да, наистина в някои случаи се налага override, но това е на потока, не на интерфейса. Освен това, аз принципно съм противник на тая идея. Много пъти съм спорил дали е удачно, най-вече защото override на такъв метод изгражда силна свързаност между класовете. Например, ако имаш клас A с променливи a и b и в него предефинираш методите за сериализация, а после клас B наследи A и добави променлива c, ще трябва и там да се overridе-нат... И така по веригата. Ама май се отплеснах  

Хайде със здраве!
Активен

Райчо Мукелов

  • Неактивен Неактивен
  • Публикации: 486
  • I snuggle with subwoofers
    • HULTIG - Human Language Technlogy and Bioinformatics Interest Group
Java - Serializaciq na neserializiruemi obekti
« Отговор #8 -: 29.11.2004, 11:51:00 »

Тъй като взе да ми става интересно си инсталирах един JBuilder и пробвах да видя какво ще стане, значи ArrayLista наистина се възстановява, но обектите в него всичките им полета са 0.0 така нищо чудно няма, че нищо не се изчертава в последствие защото всички линии всъщност са в координатното начало и са си направо точки (или по-скоро една точка).
Eто как го реших проблема:
public class MyLine2D extends java.awt.geom.Line2D.Float implements java.io.Serializable{
  public MyLine2D(float a,float b,float c,float d) {
    super(a,b,c,d);
  }
  private void writeObject(java.io.ObjectOutputStream out)throws IOException{
    out.writeDouble(this.getX1());
    out.writeDouble(this.getY1());
    out.writeDouble(this.getX2());
    out.writeDouble(this.getY2());
  }
  private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException{
    this.setLine(in.readDouble(),in.readDouble(),in.readDouble(),in.readDouble());
  }
}
Изглежда добре съм си чел между редовете         (макар че този ми навик понякога ми прави лоши шеги ама какво да се прави). В този случай за съжаление няма друг начин по който да стане сериялизацията освен чрез override на двата метода което е голяма простотия наистина защото в docs си пише ясно че е достатъчно да се наследи Serializable и че override се прави само в специални случаи пък на това не виждам какво му е специалното.Още повече Николай каза, че това са методи на потока (?) а пък се реализират в класа изобщо нещо работата е доста объркана поне за мен.

[This message has been edited by sasquatch (edited 30-11-2004).]
Активен

JOKe

  • Неактивен Неактивен
  • Публикации: 2656
  • Code or Die
Java - Serializaciq na neserializiruemi obekti
« Отговор #9 -: 29.11.2004, 21:05:00 »

sasquatch: dam taka naistina raboti zlaten si  
btw druga ideq e seki ot poznatite klasove kato Rectangle2D.Double i etc da go serializirame kato Rectangle koito e serializable samo che tova ne reshava problema s Ellipse2D ( koqto nqama takava analogiq) apak Line2D mojem do Polygon ot 2 tochki kato Polygon-a sashto e serializable.
Blagodarq vi super mnogo   i na 2mata nqamate si ideq kolko sam vi zadaljen i priznatelen   mersi mersi mersi, nqakoi den dano vi se revanshiram  
Активен

Райчо Мукелов

  • Неактивен Неактивен
  • Публикации: 486
  • I snuggle with subwoofers
    • HULTIG - Human Language Technlogy and Bioinformatics Interest Group
Java - Serializaciq na neserializiruemi obekti
« Отговор #10 -: 29.11.2004, 22:04:00 »

Ako ima vreme i vyzmojnost shte otgovarqme

[This message has been edited by sasquatch (edited 30-11-2004).]
Активен

Nikolay Manchev

  • Неактивен Неактивен
  • Публикации: 185
    • http://www.manchev.org
Java - Serializaciq na neserializiruemi obekti
« Отговор #11 -: 30.11.2004, 09:05:00 »

<BLOCKQUOTE>

Originally posted by sasquatch:

това са методи на потока (?) а пък се реализират в класа изобщо нещо работата е доста объркана поне за мен.

</font><HR></BLOCKQUOTE>

OK, за да не става объркване - аз говоря в контекста на предефиниция. Иначе, единствените методи с тая сигнатура са на ObjectOuput и на ObjectOutputStream (е, горе-долу де, но няма да намесвам PersistenceDelegate примерно и другите от beans йерархията). Всъщност, когато говорим за override в термините на сериализиращия механизъм на Java, то по-скоро говорим за override на този механизъм, а не конкретно на методите.

В крайна сметка, такива методи няма нагоре по йерархията на сериализирания клас, така че как да ги предефинираме? Да не говорим, че по сигнатура са private (друг въпрос е как се извикват). Изобщо, цялата работа със сериализацията си е един голям hack на VM-а. Между другото, доста често съм чувал да говорят за предефиниране на методите на Serializable интерфейса. Предполагам и това е начин да се каже. Дори да не е до буква вярно, смислово има логика    

И като за финал, да обърна внимание, че сериализацията не е като баничка. Освен имплементацията на Serializable, трябва да се провери и самия клас - за статични полета, за вътрешни класове (които също трябва да се сериализират) и т.н. Между другото, всички описани проблеми произтичат от един простичък факт - java.awt.geom.Line2D/Elipse2D и т.н. просто не са сериализируеми.

Ако някой друг реши да си блъска главата с тия неща, да знае, че има простичко tool-че в JDK, което проверява дали даден клас е сериализируем. Ей така става:

cerberus:~# serialver java.awt.geom.Line2D.Float
Class java.awt.geom.Line2D.Float is not Serializable.

Поздрави,

Николай Манчев

А, за малко да забравя. Принципно, като се правят такъв род неща със собствен контрол над сериализацията, май е по-добре да се ползва Externalizable. Не, че не е същото, но поне изглежда къде по-чисто.


[This message has been edited by Nikolay Manchev (edited 30-11-2004).]

[This message has been edited by Nikolay Manchev (edited 30-11-2004).]
Активен