Java io notserializableexception - IT Справочник
Llscompany.ru

IT Справочник
2 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Java io notserializableexception

java.io.NotSerializableException – How to solve Not Serializable Exception

In this tutorial we will discuss about NotSerializableException in Java. The exception is thrown when an instance of a class must implement the Serializable interface. The exception is thrown by either the serialization runtime, or by the instance of the class. The argument of the NotSerializableException is the name of the class.

The NotSerializableException class extends the ObjectStreamException class, which is defined as the superclass of all exceptions specific to Object Stream classes. Also, the ObjectStreamException class extends the IOException which signals that an I/O exception has occurred.

Finally, the NotSerializableException exists since the 1.1 version of the Java Development Kit (JDK).

The Structure of NotSerializableException

Constructors

  • NotSerializableException()

Creates an instance of the NotSerializableException class.

NotSerializableException(String s)

Creates an instance of the NotSerializableException class, using the specified string as message. The string argument indicates the name of the class that threw the error.

The NotSerializableException in Java

To begin with, the NotSerializableException can be thrown when a class does not implement the Serializable interface. A sample example is described below:

In this file, we defined the Pair class, as a Java template, which consists of two fields, key and value . Also, we defined the following methods:

Returns the key of the pair.

Returns the value of the pair.

boolean equals(Object o)

Checks whether the specified object equals to this pair.

Returns a String representation of the Pair class.

In this file, we defined the Serializer class, which contains the following two static methods:

    static byte[] serialize(T object)

Serializes the specified object in a byte array.

static Object deserialize(byte[] byteArray)

Deserializes the specified byte array to an instance of the Object class.

In this file, we defined the main method of our application that aims to serialize an instance of the Pair class. However, the Pair class does not implement the Serializable interface and thus, the NotSerializableException is thrown.

A sample execution is shown below:

Also, the NotSerializableException can be thrown when a class that implements the Serializable interface contains fields that are not serializable:

In this file, we defined the SerializableClass that contains a Pair field. The SerializableClass implements the Serializable interface, but it refers to the Pair class which doesn’t.

A sample execution is shown below:

How to deal with the NotSerializableException

  • The simplest solution is to find the class that throws the exception and make it implement the Serializable interface. However, this may not be feasible if the class that throws the exception belongs to a third-party library.
  • In case the class refers to non-serializable objects and these objects should not be serialized, then, you can declare these objects as transient . Once a field of a class is declared as transient , then, it is ignored by the serializable runtime. For example:
    TransientExample.java:

In this file, we defined the TransientExample that contains a Pair field. The TransientExample implements the Serializable interface, but it refers to the Pair class which doesn’t. However, the reference is declared as transient and thus, the object can be serialized normally:

A sample execution is shown below:

Download the Eclipse Project

This was a tutorial about the NotSerializableException in Java.

Почему я получаю java.io.NotSerializableException, когда класс реализует сериализуемый интерфейс?

Когда я пытаюсь serialize объект с вызовом, stashCon.stash() я получаю java.io.NotSerializableException , даже когда класс StashCon реализует интерфейс Serializable .

В чем же может быть причина этого ?

Следующий метод относится к классу StashCon

2 Ответа

Ваш объект содержит переменные-члены, которые сами по себе не сериализуемы (экземпляр org.jivesoftware.smack.XMPPConnection ).

Если вы действительно хотите сериализовать свой объект, вам придется что-то сделать с этой переменной-членом. Одним из вариантов было бы объявить эту переменную как transient , чтобы она не была сериализована.

Читать еще:  Java arraylist indexof

Однако при десериализации вам придется обработать этот элемент (например, повторно установить соединение). Для этого можно было бы определить метод readObject , который вызывается во время десериализации. Там вы можете (и, вероятно, должны) инициализировать все переходные переменные-члены, чтобы установить ваш объект в хорошее состояние.

Вот также хороший вопрос, обсуждающий сериализацию.

XMPPConnection связан с физическими ресурсами (TCP сокетов) на машине, в которой он находится, поэтому его нельзя сделать сериализуемым. Он также имеет идентификатор, связанный с подключением к серверу, который не может быть продублирован, так как полный JID может быть подключен к тому же серверу только один раз, второе соединение заставит другого отключиться.

Соединение не должно быть помещено в сеанс, вы должны управлять им вне этой области.

Похожие вопросы:

Возможный Дубликат : Почему Java нуждается в Сериализуемом интерфейсе? Согласно Сериализуемости в Java docs : Сериализуемость класса включается классом, реализующим java.io.Serializable интерфейс.

Я попытался сериализовать ArrayList с JAXB и потерпел неудачу. Это потому, что elementData помечен как переходный? Почему ArrayList реализует сериализуемый Inferface и имеет переходные данные? Я.

public class Employee2 extends Employee1 <> public class Employee1 extends Employee0 <> public class Employee0 <> Теперь я сериализую класс Employee2 и get the error.

Я получаю следующее notSerializableException, хотя мой класс концентратора реализует сериализуемый. Это происходит, когда я пытаюсь записать в файл с помощью ObjectOutputStream. Мой проект содержит.

Я просто хочу знать, как мы можем Serialize класс Jdbc4SQLXML , который расширяет java.lang.Object и реализует java.sql.SQLXML в соответствии с postgres API. Даже интерфейс SQLXML не расширяет.

В соответствии с javadoc, public class AtomicInteger extends Number implements java.io.Serializable < // code for class >Но, public abstract class Number implements java.io.Serializable < //code.

Мой вопрос заключается в том, когда у нас есть класс, который реализует сериализуемый интерфейс, и когда мы отправляем объект этого класса по сети, делает ли JVM копию объекта в память или как JVM.

@Entity public class Husband implements Serializable < @Id private int id; private String name; @OneToOne private Wife wife; >@Entity public class Wife implements Serializable < @Id private int id;.

Технически я знаю, почему класс нужно реализовать сериализуемым . Причина — writeObject метод ObjectOutputStream внутренне проверяет instance of serializable перед записью состояния объекта. Но мой.

Класс HashMap реализует интерфейс карты : public class HashMap extends AbstractMap implements Map , Cloneable, Serializable Класс LinkedHashMap расширяет HashMap, что.

How to fix java.io.NotSerializableException: org.apache.log4j.Logger Error in Java

How to solve java.io.NotSerializableException: org.apache.log4j.Logger

11 comments :

I am also facing same issue only in Cluster environment.

public class ViewAction implements Serializable<

private static Logger LOGGER = Logger.getLogger(ViewAction.class);
.
>

java.rmi.ServerException: RemoteException occurred in server thread; nested exception is:
java.rmi.MarshalException: CORBA BAD_PARAM 0x4f4d0006 Maybe; nested exception is:
java.io.NotSerializableException: org.apache.log4j.Logger is not serializable
at com.ibm.CORBA.iiop.UtilDelegateImpl.wrapException(UtilDelegateImpl.java:749)
at javax.rmi.CORBA.Util.wrapException(Util.java:296)
at com.cib.infra.txn._TxnProcessorRemote_Stub.handleRequest(Unknown Source)
at com.ws.framework.PortletAction.connect(PortletAction.java:461)
at com.ws.framework.PortletAction.executeHostRequest(PortletAction.java:435)
at com.ws.view.action.ViewAction.getExportData(ViewAction.java:294)
at com.ws.services.exportdata.ExportServiceServlet.doPost(ExportServiceServlet.java:141)
at com.polaris.iportal.ws.services.exportdata.ExportServiceServlet.doGet(ExportServiceServlet.java:335)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:718)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:831)

for which class, it it for this class then you already made Logger instance static. I think you should check ExportServiceServlet.java

in my ExportServiceServlet.java it declared like below one.

public class ExportServiceServlet extends HttpServlet
<
private static Logger logger = Logger.getLogger(com/ws/services/exportdata/ExportServiceServlet);
.
>

That’s also static. Can you let me know when does this error occur, I mean which object are you trying to store in Session? Another way is look for a logger instance which is not static.

Thanks for Suggestion.

In PortletAction class logger instance is not static. Will this cause issue?

Also Is that required to declare it like «private static final» or «private static» is enough.

public abstract class PortletAction extends IOrbiAction
<
public PortletAction()
<
logger = Logger.getLogger(com/ws/framework/PortletAction);
>
.
private Logger logger;

Yes, this will cause issue, if you try to put any object, which directly or indirectly has reference of this class. Make it private static. Regarding your question, its always good to made static variable final, to avoid accidental change, because it’s shared between instances. to avoid java.io.NotSerializableException, its enough to making it static.

Читать еще:  Java net uri

March 8, 2013 at 2:00 AM Anonymous said.

you helped me a lot . thank you

Hi I’m encountering similar intermittent error java.io.NotSerializableException: oracle.jdbc.driver.T4CConnection. Could you suggest what approach could be taken for the same.Could the above approach of making private static would help in this case

Hello @Unknown, yes you can either make it static or transient, both will work.

@Javin Paul: Hi, when i try to make a remote ejb call to the bean , it seems to throw java.io.NotSerializableException: oracle.jdbc.driver.T4CConnection. tried making connection object private static. but did not help. The environment is Jboss eap 7(wildfly)

Check your EJB bean, does it contain any field which is not serializable and not transient or static?

Задача не сериализуемая: java.Ио.NotSerializableException при вызове функции вне закрытия только для классов не объектов

получение странного поведения при вызове функции вне закрытия:

  • когда функция находится в объекте, все работает
  • когда функция находится в классе вам :

задача не сериализуема: java.Ио.NotSerializableException: тестирование

проблема в том, что мне нужен мой код в классе, а не объект. Есть идеи, почему это происходит? Сериализован ли объект Scala (по умолчанию?)?

Это пример рабочего кода:

это нерабочий пример:

6 ответов

Я не думаю, что другой ответ совершенно правильный. RDDs действительно сериализуемы, так что это не то, что вызывает вашу задачу не получится.

Spark-это распределенный вычислительный движок, а его основная абстракция-устойчивый распределенный набор данных (RDD), которое можно рассматривать как совокупность. В принципе, элементы RDD секционируются по узлам кластера, но Spark абстрагирует это от пользователя, позволяя пользователю взаимодействуйте с RDD (коллекцией), как если бы она была локальной.

не вдаваться в слишком много деталей, но при запуске различных преобразований на RDD ( map , flatMap , filter и другие), ваш код преобразования (закрытие):

  1. сериализовано на узле драйвера,
  2. отправлено на соответствующие узлы кластера,
  3. десериализации
  4. и, наконец, выполняется на узлах

вы можете конечно, запустите это локально (как в вашем примере), но все эти фазы (кроме доставки по сети) все еще происходят. [Это позволяет ловить любые ошибки даже перед развертыванием в производство]

во втором случае вы вызываете метод, определенный в классе testing внутри функции map. Spark видит это, и поскольку методы не могут быть сериализованы самостоятельно, Spark пытается сериализовать весь testing class, так что код все равно будет работать при выполнении в другой JVM. У вас есть две возможности:—14—>

либо вы делаете тестирование класса сериализуемым, поэтому весь класс может быть сериализован Spark:

или вы делаете someFunc функция вместо метода (функции являются объектами в Scala), так что Spark сможет сериализовать его:

подобная, но не та же проблема с сериализацией классов может представлять интерес для вас, и вы можете прочитать на нем в этом саммите Spark 2013 презентация.

в качестве примечания вы можете переписать rddList.map(someFunc(_)) to rddList.map(someFunc) , они точно такие же. Как правило, второй предпочтительнее, поскольку он менее многословен и чище для чтения.

EDIT (2015-03-15):Искра-5307 ввел SerializationDebugger и Spark 1.3.0 является первой версией, чтобы использовать его. Он добавляет путь сериализации к NotSerializableException. Когда NotSerializableException встречается, отладчик посещает график объекта, чтобы найти путь к объекту, который не может быть сериализован, и создает информацию, помогающую пользователю найти объект.

в случае OP это то, что печатается в stdout:

ответ Греги отлично объясняет, почему исходный код не работает, и два способа устранить проблему. Однако это решение не очень гибкое; рассмотрим случай, когда ваше закрытие включает вызов метода на не — Serializable класс, что у вас нет контроля над. Вы не можете добавить Serializable tag к этому классу или изменить базовую реализацию, чтобы изменить метод в функцию.

Nilesh представляет собой отличное решение для это, но решение можно сделать как более кратким, так и общим:

Читать еще:  Java scripts error

эта функция-сериализатор может затем использоваться для автоматического обертывания закрытия и вызовов методов:

этот метод также имеет преимущество, не требуя дополнительных зависимостей акулы для доступа KryoSerializationWrapper , так как холод Twitter уже втянут core Spark

полный разговор полностью объясняет проблему, которая предлагает отличный способ смены парадигмы, чтобы избежать этих проблем сериализации: https://github.com/samthebest/dump/blob/master/sams-scala-tutorial/serialization-exceptions-and-memory-leaks-no-ws.md

верхний голосованный ответ в основном предлагает выбросить всю языковую функцию — то есть больше не использовать методы и использовать только функции. Действительно, в функциональном программировании методы в классах должны быть избежать, но превращение их в функции не решает проблему дизайна здесь (см. ссылку выше).

в качестве быстрого исправления в этой конкретной ситуации вы можете просто использовать @transient аннотация, чтобы сказать ему не пытаться сериализовать оскорбительное значение (здесь, Spark.ctx является пользовательским классом, а не одним из следующих имен OP):

вы также можете реструктурировать код, чтобы rddList жил где-то еще, но это также неприятно.

будущее наверное Споры

в будущем Scala будет включать в себя эти вещи, называемые «споры», которые должны позволить нам контролировать мелкое зерно, что делает и не точно втягивается закрытием. Кроме того, это должно превратить все ошибки случайного вытягивания несериализуемых типов (или любых нежелательных значений) в ошибки компиляции, а не сейчас, что является ужасными исключениями во время выполнения / утечками памяти.

A совет по сериализации Kryo

при использовании kyro сделайте так, чтобы регистрация была необходима, это будет означать, что вы получаете ошибки вместо утечек памяти:

конечно, это только дает вам контроль уровня типа, а не контроль уровня значения.

. еще больше идей.

Я решил эту проблему, используя другой подход. Вам просто нужно сериализовать объекты перед прохождением через закрытие,а затем де-сериализовать. Этот подход просто работает, даже если ваши классы не Сериализуемы, потому что он использует Kryo за кулисами. Все, что тебе нужно, это немного карри. 😉

вот пример того, как я это сделал:

Не стесняйтесь делать мля так сложно, как вы хотите, класс, объект, вложенные классы, ссылки на несколько 3-й партии библиотеки.

Я не совсем уверен, что это относится к Scala, но на Java я решил NotSerializableException на рефакторинг мой код так, что закрытие не открыть несериализуемый

я столкнулся с подобной проблемой, и что я понимаю из ответ Греги is

код doIT метод пытается сериализовать someFunc(_) метод, но поскольку метод не сериализуем, он пытается сериализовать class тестирование который снова не сериализуется.

чтобы сделать ваш код работать, вы должны определить someFunc внутри doIT метод. Например:

и если есть несколько функций, входящих в картину, то все эти функции должны быть доступны родительскому контексту.

Java io notserializableexception

please have a look at the following three set of codes, which is using the «Vector» class.

The code is running fine, untill the Client.java is being executed. As soon as that code started, the Server.java throws the following exception

java.io.NotSerializableException: Publishers
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1180)
at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1362)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1170)
at java.io.ObjectOutputStream.access$300(ObjectOutputStream.java:161)
at java.io.ObjectOutputStream$PutFieldImpl.writeFields(ObjectOutputStream.java:1687)
at java.io.ObjectOutputStream.writeFields(ObjectOutputStream.java:478)
at java.util.Vector.writeObject(Vector.java:1073)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:962)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1480)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1416)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346)
at Server.run(Server.java:65)

The Client.java throws the following exception

java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: Publishers
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1685)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1341)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1964)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1888)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1771)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369)
at Client.init(Client.java:49)
at sun.applet.AppletPanel.run(AppletPanel.java:434)
at java.lang.Thread.run(Thread.java:722)
Caused by: java.io.NotSerializableException: Publishers
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1180)
at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1362)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1170)
at java.io.ObjectOutputStream.access$300(ObjectOutputStream.java:161)
at java.io.ObjectOutputStream$PutFieldImpl.writeFields(ObjectOutputStream.java:1687)
at java.io.ObjectOutputStream.writeFields(ObjectOutputStream.java:478)
at java.util.Vector.writeObject(Vector.java:1073)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:962)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1480)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1416)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346)
at Server.run(Server.java:65)

I guess this is done by the Vector class. Anyway I know I should not use this class because it is replaced by the ArrayList, but we HAVE to use it. Please help me to find this error and correct it. Thanks

Ссылка на основную публикацию
ВсеИнструменты 220 Вольт
Adblock
detector