Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сериализация безымянных классов, WriteAbortedException 
V
    Опции темы
adf
Дата 22.5.2007, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Господа, добрый день!

Есть некий класс, внутри которого объявлена переменная вида:
Код

class myClass {
    private  Map <String, SomeClass> myVariable = new TreeMap <String, ComeClass> (new Comparator <String> ) {
             public int compare(String o1, String o2) {               
               // сравнение объектов...
             }
         });
//...
}

Я пытаюсь сериализовать данную переменную в файл, и естественно: java.io.NotSerializableException

То есть, надо куда-то воткнуть  implements Serializable, но не могу сообразить куда.
Обязательно ли создание нового класса?

Никак не могу сообразить что сделать, ступор просто какой-то, подскажите пожалуйста!
PM MAIL   Вверх
powerOn
Дата 22.5.2007, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

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



Стек трейс покажи. Есть предположение что он ComeClass сериализовать не может.


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
adf
Дата 23.5.2007, 07:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Дело в том, что до этого у меня была сериализация массива из объектов  SomeClass (само-собой, он был implements Serializable), ошибок не возникало. В процессе эволюции кода, пришла к выводу, что сортированная карта лучше подходит.

Код

java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: logic.year.Year$1
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1303)
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1912)
    at java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:468)
    at java.util.TreeMap.readObject(TreeMap.java:1488)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:585)
    at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:919)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1813)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1713)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1299)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:339)
    at manager.YearManager.restoreYear(YearManager.java:941)
    at manager.YearManager.restore(YearManager.java:133)
    at frames.MainFrame.<init>(MainFrame.java:220)
    at frames.app.<init>(app.java:12)
    at frames.app.main(app.java:35)
Caused by: java.io.NotSerializableException: logic.year.Year$1
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1075)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1369)
    at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:380)
    at java.util.TreeMap.writeObject(TreeMap.java:1466)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:585)
    at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:890)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1333)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1284)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1073)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:291)
    at manager.YearManager.save(YearManager.java:109)
    at frames.MainFrame$10.actionPerformed(MainFrame.java:583)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1849)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2169)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:420)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:234)
    at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:231)
    at java.awt.Component.processMouseEvent(Component.java:5488)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3126)
    at java.awt.Component.processEvent(Component.java:5253)
    at java.awt.Container.processEvent(Container.java:1966)
    at java.awt.Component.dispatchEventImpl(Component.java:3955)
    at java.awt.Container.dispatchEventImpl(Container.java:2024)
    at java.awt.Component.dispatchEvent(Component.java:3803)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4212)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3892)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3822)
    at java.awt.Container.dispatchEventImpl(Container.java:2010)
    at java.awt.Window.dispatchEventImpl(Window.java:1774)
    at java.awt.Component.dispatchEvent(Component.java:3803)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
    at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)



PM MAIL   Вверх
powerOn
Дата 23.5.2007, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

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



Цитата(adf @  23.5.2007,  08:05 Найти цитируемый пост)
В процессе эволюции кода, пришла к выводу, что сортированная карта лучше подходит.

TreeMap сам по себе прекрасно сериализуется. Тут ошибка в сериализации класса logic.year.Year$1. - Это некий анонимный внутренний класс в классе logic.year.Year. 

Это сообщение отредактировал(а) powerOn - 23.5.2007, 09:00


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
adf
Дата 23.5.2007, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Там больше нет внутренних классов..
Вот даже набросала простой пример.

Ошибка все та же

Что я не так делаю?

класс SomeClass
Код

package pr;

import java.io.Serializable;

public class SomeClass implements Serializable {
    private String str;
    public SomeClass(String stri) {
        str = stri;
    }
    public String toString(){
        return str;
    }
}

_________________________
класс  myClass

Код

package pr;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

import java.util.Comparator;
import java.util.Map;
import java.util.TreeMap;

public class myClass {
    
    private  Map <String, SomeClass> myVariable = new TreeMap <String, SomeClass> ( new Comparator <String> () {
            public int compare(String o1, String o2) {
             
                if(o1.equals(o2)) {
                    return 0;
                }
                int val1 = 0;
                int val2 = 0;
                try { 
                    val1 = Integer.parseInt(o1);
                    val2 = Integer.parseInt(o2);
                } catch (NumberFormatException nfe) {
                    System.out.println("some error "+ nfe);
                    return 0;
                }
                if(val1==val2) {
                    return 0;
                }
                if (val1>val2){
                    return 1;
                }
                if (val2>val1) {
                    return -1;
                }             
                
                return 0;            
                
            }
        });
  
    //---------------------------------------------- 
    private void initByDef (){    
       myVariable.put("10", new SomeClass("Ten"));
       myVariable.put("1", new SomeClass("One"));
       myVariable.put("5", new SomeClass("Five"));    
    }
    //----------------------------------------------
    private void save(){     
            ObjectOutputStream out = null;
            try {
                //сохраняем объект
                out = new ObjectOutputStream (new FileOutputStream("ser.file"));                   
                out.writeObject (   myVariable    );                                     
             } catch(Exception ioexc){
                ioexc.printStackTrace();            
             }  finally {
                try {                
                    out.close(); 
                } catch (IOException e) {
                    e.printStackTrace();
                }
             }                      
        }      
     
    //----------------------------------------------
    private void restore(){  
        File f = new File ( "ser.file" );
        if(!f.exists()){
          System.out.println("Файл не существует");
          return;
        }
        ObjectInputStream in = null;      
        try  {
            in = new ObjectInputStream (new FileInputStream("ser.file"));
            myVariable = ( TreeMap <String, SomeClass> )in.readObject();          
        } catch (Exception eeee){
            System.out.println("Exception1 " + eeee);   
            eeee.printStackTrace();
        }  finally {
            try {
                if(in!=null)
                    in.close();
            } catch (IOException e) {
                System.out.println("Exception2 "+e);  
                e.printStackTrace();
            }
            
        }
  } 
    //==========================  
    public static void main(String[] args) { 
        myClass myClass = new myClass();
        myClass.initByDef();
        System.out.println(myClass.myVariable.toString());        
        myClass.save(); 
        myClass.restore();  
        System.out.println(myClass.myVariable.toString());
    }
    
}



PM MAIL   Вверх
powerOn
Дата 23.5.2007, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

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



Это баг Java.
Придется отказаться от внутренних классов. У меня работать стало только тогда, когда компаратор вынес во внешний класс.

Код

class MyComparator implements Comparator<String>, java.io.Serializable 
{
    public int compare(String o1, String o2)
    {
        if (o1.equals(o2))
        {
            return 0;
        }
        int val1 = 0;
        int val2 = 0;
        try
        {
            val1 = Integer.parseInt(o1);
            val2 = Integer.parseInt(o2);
        }
        catch (NumberFormatException nfe)
        {
            System.out.println("some error " + nfe);
            return 0;
        }
        if (val1 == val2)
        {
            return 0;
        }
        if (val1 > val2)
        {
            return 1;
        }
        if (val2 > val1)
        {
            return -1;
        }

        return 0;
    }
};


Код

public class myClass
{
    private Map<String, SomeClass> myVariable = 
        new TreeMap<String, SomeClass>( new MyComparator() );
.....


Что удивительно, если MyComparator сделать внутренним для myClass,
Код

public class myClass
{
    class MyComparator implements Comparator<String>, java.io.Serializable 
    {
   

то не смотря на то, что он имплементирует Serializable, код падает. ИМХО, это настоящий баг. 
Конечно можно углубиться, и под отладчиком по сурсам JDK пробежаться, чтобы посмотреть что же реально происходит, но увы у меня пока нет лишних пары часов.


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
adf
Дата 23.5.2007, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вот это чудеса!

Все заработало, спасибо большое!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

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


 




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


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

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