Java, Serialization, вы можете сериализовать класс внутри класса

Возможный дубликат:
   Почему сериализуемый внутренний класс не сериализуем?

У меня есть класс, который не реализует Serializable . Внутри этого класса у меня есть класс данных, который содержит данные для всей программы, которая реализует Serializable и имеет идентификатор версии.

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

Можете ли вы сериализовать класс в классе без сериализации?

Пример:

class main
{
   class data implements Serializable
   { //data and functions }

   public void main(args)
   { data d = new data();
    //ofcourse I have the proper inits and checks for the output stream and such
     writeObject(data); //Throws Class not Serializable error.}
} 
1
nl ja de
Что это за метод .writeObject() ? data здесь нет ObjectOutputStream .
добавлено автор fge, источник
Если ваш data класс static , я думаю, что это должно быть возможно.
добавлено автор MrSmith42, источник
Я знаю, что правильно пишу код, это более абстрактный вопрос, чем я правильно написал код. И да, артбристол, я думаю, что это дубликат.
добавлено автор AnotherUser, источник

2 ответы

Поскольку data не является static , он неявно ссылается на свой внешний класс main , который не является Serializable.

Попробуйте сделать класс static .

5
добавлено
@ user1596244 одним разным кодом является то, что если бы вы получили доступ к вашему data классу извне main , вам понадобится экземпляр main в чтобы создать экземпляр data , например, в (ewww) new main (). new data() . Если data является статическим, вам просто нужно new main.data() без необходимости иметь экземпляр main .
добавлено автор fge, источник
static означает, что у него нет ссылки implict на внешний класс, то есть он удаляет ссылку на класс, который не является Serializable. BTW Я бы сделал все вложенные классы static , если можно.
добавлено автор Peter Lawrey, источник
Создание статического кода data означает, что он не может ссылаться на main , поскольку это не Serializable.
добавлено автор Peter Lawrey, источник
Внешний класс может получить доступ ко всему во внутреннем классе, если у него есть ссылка на экземпляр. Внутренний класс может получить доступ к чему-либо из внешнего класса, если у него есть ссылка на него. Какой static нет ссылки неявный на экземпляр внешнего класса.
добавлено автор Peter Lawrey, источник
Вам нужно будет сделать ссылку transient , чтобы она не была сериализована так, как она не может быть, и сбросить ее, когда класс десериализуется.
добавлено автор Peter Lawrey, источник
Я не новичок в java отнюдь не потому, что у класса static есть презумпции? Почему это делает статическую работу?
добавлено автор AnotherUser, источник
Член моего самого внешнего несерийного класса - данные d = new Data() ;. Создание класса данных static, означает ли это, что методы и функции внутри внешнего класса могут или не могут получить доступ к этому объекту d данных. Я полагаю, что это не проблема. (TYPO в OP, у меня есть данные d, вне основного)
добавлено автор AnotherUser, источник
Таким образом, при этом он статичен, он не может получить доступ к каким-либо полям или функциям в своем инкапсулирующем/внешнем классе. Но поля и методы во внешнем классе могут обращаться к полям и методам в классе данных, правильно? --- Это хорошо, я хочу, чтобы данные сохраняли данные. Позвольте мне написать ему и прочитать от него, ему не нужно обращаться к внешним функциям или полям. Это правильно?
добавлено автор AnotherUser, источник
Поэтому, если я хочу, чтобы мой внутренний класс получил доступ к внешнему, мне нужно сделать метод внутри внутреннего класса, чтобы установить ссылку на класс, ссылаясь на внешний класс?
добавлено автор AnotherUser, источник
Спасибо, Питер, теперь это имеет большой смысл!
добавлено автор AnotherUser, источник

Если вы декомпилируете свой основной класс, вы увидите, что в реальном коде

public class main {

    class data implements Serializable {
        final main this$0;

        data() {
            this$0 = main.this;
        }
    }
}

data contains a reference to its outer class main. This so called synthetic field is added by javac. When ObjectOutputStream is trying to serizalize data it stumbles upon a reference to a non-serializable class and breaks. So to be serializable you should make main implement Serializable too, or make data static class then the reference to main will go

3
добавлено
pro.jvm
pro.jvm
3 503 участник(ов)

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш сайт: projvm.com projvm.ru Наш канал: @proJVM Вакансии: @jvmjobs Конфы: @jvmconf

Java & Co
Java & Co
2 370 участник(ов)

Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/75723 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude

learn.java
learn.java
1 888 участник(ов)

Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat

Java Underground
Java Underground
169 участник(ов)

https://vk.com/javatutorial

Javanese Questions
Javanese Questions
109 участник(ов)

Чат предназначен для обмена знаниями строго в формате в вопрос-ответ. Тема — Java, Kotlin и Android. Вопрос должен быть предварительно прогуглен, понятно и грамотно сформулирован, помечен хэштегами. Ответ — тем более. Куски кода размером в несколько строк можно писать прямо здесь, для больших кусков кода стоит использовать http://gist.github.com/, http://pastebin.com/, https://codeshare.io/ или любой аналогичный сервис. В некоторых случаях можно прикреплять скриншоты. Стикеры и гифки запрещены. Дополнять и уточнять вопросы и ответы — редактированием исходного сообщения. Обсуждения должны приводить к редактированию вопроса/ответа и удаляться. По хештегам можно искать существующие вопросы и овтеты: #вопрос #ответ #git #generics #java #server #awt #javafx #swing #kotlin #anko #tornadofx #ktor #android #recyclerView #performance #arch #network #permissions #storage #async