Исправить ошибку сериализация

Исправить ошибку. Сериализация


This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters

Show hidden characters

package com.javarush.task.task20.task2019;
import java.io.*;
import java.util.HashMap;
import java.util.Map;
/*
Исправить ошибку. Сериализация
*/
public class Solution implements Serializable {
public static void main(String args[]) throws Exception {
FileOutputStream fileOutput = new FileOutputStream(«your.file.name»);
ObjectOutputStream outputStream = new ObjectOutputStream(fileOutput);
Solution solution = new Solution();
//System.out.println(solution.size()); //-
outputStream.writeObject(solution);
fileOutput.close();
outputStream.close();
//load
FileInputStream fiStream = new FileInputStream(«your.file.name»);
ObjectInputStream objectStream = new ObjectInputStream(fiStream);
Solution loadedObject = (Solution) objectStream.readObject();
fiStream.close();
objectStream.close();
//Attention!!
System.out.println(loadedObject.size());
}
private Map<String, String> m = new HashMap<>();
public Map<String, String> getMap() {
return m;
}
public Solution() {
m.put(«Mickey», «Mouse»);
m.put(«Mickey», «Mantle»);
}
public int size() {
return m.size();
}
}
/* Исходник
public class Solution implements Serializable {
public static void main(String args[]) throws Exception {
FileOutputStream fileOutput = new FileOutputStream(«your.file.name»);
ObjectOutputStream outputStream = new ObjectOutputStream(fileOutput);
Solution solution = new Solution();
outputStream.writeObject(solution);
fileOutput.close();
outputStream.close();
//load
FileInputStream fiStream = new FileInputStream(«your.file.name»);
ObjectInputStream objectStream = new ObjectInputStream(fiStream);
Solution loadedObject = (Solution) objectStream.readObject();
fiStream.close();
objectStream.close();
//Attention!!
System.out.println(loadedObject.size());
}
private Map<String, String> m = new HashMap<>();
public Map<String, String> getMap() {
return m;
}
public void Solution() {
m.put(«Mickey», «Mouse»);
m.put(«Mickey», «Mantle»);
}
public int size() {
return m.size();
}
}*/


This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters

Show hidden characters

taskKey=»com.javarush.task.task20.task2019″\n\nИсправить ошибку. Сериализация
После десериализации объекта класса Solution обнаружили, что данных в словаре [m] нет :(
Исправить 1 ошибку.
Требования:
1. В классе Solution не должно быть метода void Solution без параметров.
2. В классе Solution должен существовать конструктор без параметров.
3. В классе Solution должен существовать метод size без параметров.
4. В классе Solution метод size должен возвращать значение типа int.

Проблема, с которой мы сегодня столкнемся, заключается в ошибке сериализации объектов в JSON с помощью библиотеки Jackson. При попытке сериализовать простой

Проблема, с которой мы сегодня столкнемся, заключается в ошибке сериализации объектов в JSON с помощью библиотеки Jackson. При попытке сериализовать простой объект, возникает ошибка «No serializer found».

Рассмотрим пример кода, который может вызвать такую ошибку:

public class TestClass {
    String someString = "test";
}

TestClass testObject = new TestClass();
ObjectMapper objectMapper = new ObjectMapper();

try {
    String jsonString = objectMapper.writeValueAsString(testObject);
    TestClass newTestObject = objectMapper.readValue(jsonString, TestClass.class);
} catch (JsonGenerationException e) {
    e.printStackTrace();
} catch (JsonMappingException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}

В данном случае, при попытке сериализовать объект testObject, возникает ошибка «No serializer found for class … and no properties discovered to create BeanSerializer».

Причина ошибки

Основная причина такой ошибки — отсутствие доступных для сериализации свойств в сериализуемом классе. В примере выше, свойство someString объявлено без модификаторов доступа, что означает, что оно доступно только внутри класса TestClass. Библиотека Jackson не может получить доступ к этому свойству и вызывает ошибку.

Решение проблемы

Для решения этой проблемы необходимо сделать свойства сериализуемого класса доступными для библиотеки Jackson. Самый простой способ сделать это — объявить свойства как public. Вот исправленный пример:

public class TestClass {
    public String someString = "test";
}

Теперь свойство someString доступно для библиотеки Jackson, и ошибка «No serializer found» не возникнет.

Однако, объявление свойств как public не всегда является наилучшим решением, так как это может нарушить инкапсуляцию данных. Более предпочтительным способом является использование геттеров и сеттеров. Библиотека Jackson автоматически использует их для доступа к свойствам.

public class TestClass {
    private String someString = "test";

    public String getSomeString() {
        return someString;
    }

    public void setSomeString(String someString) {
        this.someString = someString;
    }
}

Таким образом, ошибка «No serializer found» в Jackson обычно вызвана отсутствием доступа к свойствам сериализуемого класса. Для исправления этой ошибки, сделайте свойства доступными для Jackson, используя public или геттеры и сеттеры.

Рутовый класс:

[Serializable]
[XmlRoot("Main")]
public class MainClass
{
    public MainClass()
    {
        Parents = new List<MyParent>();
    }

    [XmlElement("Parent")]
    public List<MyParent> Parents { get; set; }
}

Есть родительский класс:

[Serializable]
[XmlRoot("Parent")]
public class MyParent
{
    public enum myEnum : int
    {
        One,
        Two,
        Three
    };

    [XmlAttribute("Id")]
    public string Id { get; set; }

    [XmlAttribute("Name")]
    public string Name { get; set; }
}   

Есть класс, расширяющий его:

[Serializable]
[XmlRoot("Parent")]
public class MyChild : MyParent
{
    public MyChild()
    {
        Child = new List<InnerParameter>();
    }

    [XmlElement("Child")]
    public List<InnerParameter> Child { get; set; }
}

Этот класс раскрывает, что внутри тега Child:

[Serializable]
[XmlRoot("Child")]
public class InnerParameter
{
    public InnerParameter()
    {

    }

    [XmlText]
    public string Value { get; set; }
}

Затем, пытаюсь сериализовать:

MainClass newMainXml = new MainClass();
newMainXml.Parents = new List<MyParent>();
MyChild ch = new MyChild ();

ch.Id = "123";
ch.Name = "Stefani";

InnerParameter parameter = new InnerParameter();
parameter.Value = "MyText";
ch.Child.Add(parameter);

newMainXml.Parents.Add(ch);

XmlSerialization.TrySerializeObjectToXmlString(newMainXml, out result);

Хочу на выходе такую XML:

<Main>
    <Parent Id="123" Name="Stefani">
        <Child>MyText</Child>
    </Parent>
</Main>

Получаю ошибку сериализации:

There was an error generating the XML document. The type MyChild was not expected. Use the XmlInclude or SoapInclude attribute to specify types that are not known statically.

Подскажите пожалуйста, что я делаю не так в формировании xml? Почему сериализация не работает? (Есть большое подозрение, что дело тут в наследовании и зависимости классов между собой. Наверно, надо сказать, что MyChild не единственный класс, который расширяет MyParent…)

P.S.: похоже, что тут ситуация как у меня почти: XML-сериализация объекта с полем типа Object C#

Здравствуйте.Я создал программу где пользователь может зарегистрироваться.Для того чтобы сохранить данные я использую сериализацию.Но проблема в том что при чтении из файла консоль даёт ошибку.Как мне это исправить?

Это данные для регистрации

import java.io.Serializable;
import java.util.Scanner;

public class RegistrationData implements Serializable {
    public String name;
    public String surname;
    public int age;
Scanner sc=new Scanner(System.in);
    public String getName() {
        return name;
    }

    public void setName(String name) {
        System.out.println("Введите ваше имя");
        name=sc.nextLine();
        this.name = name;
    }

    public String getSurname() {
        return surname;
    }

    public void setSurname(String surname) {
        System.out.println("Введите вашу фамилию");
        surname=sc.nextLine();
        this.surname = surname;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        System.out.println("Ведите ваш возрост");
        int Age= sc.nextInt();
        this.age = age;
    }
}

Создал объект этого класса в другом классе

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Scanner;

public class Registration implements Serializable {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
         RegistrationData u = new  RegistrationData();
        u.setName(u.getName());
        u.setSurname(u.getSurname());
        u.setAge(u.getAge());
        try {
            FileOutputStream fis = new FileOutputStream("Users.bin");
            ObjectOutputStream ous = new ObjectOutputStream(fis);
            ous.writeObject(u);
            ous.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

И создал класс где я буду узнать данные в файле

import java.io.*;
import java.util.Scanner;

public  class Users implements Serializable {
    public static void main(String[] args) {

        try {
            FileInputStream fis=new FileInputStream("Users.bin");
            ObjectInputStream ous=new ObjectInputStream(fis);

Registration newMath=(Registration) ous.readObject();
ous.close();
            System.out.println(newMath);

        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }



    }
}

История заключается в том, что когда я пытаюсь решить проблему с большими данными в нашем задании Spark, которое собирало все данные в узел драйвера вместо того, чтобы получать и обрабатывать данные в каждом разделе, а затем получило ошибку сериализации

org.apache.spark.SparkException: Task not serializable

Первое, что я сделал, — это попытался найти соответствующую информацию об этой ошибке на Stack Overflow, Medium и т. д. К счастью, я получил несколько советов, (ссылки в приложении), которые, я думаю, помогли мне узнать больше о как выполняется задание Spark, что такое ленивая оценка и некоторые примечания, когда мы используем flatMap или mapPartition и т. д. И я поделюсь здесь со всеми, у кого возникает та же проблема, что и у меня, это может сэкономить много времени для решения вашей проблемы.

Зачем нам нужна сериализация в задании Spark?

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

И если есть переменная, ссылка внутри вашего объекта не может быть сериализована, тогда Spark выдаст ошибку Task not serializable.

Как это решить?

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

  • Как можно чаще объявляйте свои переменные и функции внутри Object. Объект выглядит как глобальная переменная, и мы можем использовать его в любом месте вашего кода.
  • Объявите, что ваш собственный класс расширяет Serializable, чтобы убедиться, что ваш класс будет передан правильно.
  • Если есть переменная, которую нельзя сериализовать, вы можете использовать аннотацию @transient следующим образом:
@transient lazy val queue: AmazonSQS = AWSQueueUtils.getClient(config)
  • Если вы используете flatMap или mapPartitions, вы должны следовать приведенной ниже практике из-за использования TravelsableOne
val result: Int = df.rdd.mapPartitions(p => Iterator {
  // Collect data per partition first
  val partition: Seq[Row] = p.toList
  // Any calculation on partition val
  ...
}).collect().sum

Как его отладить?

Важным ключом к решению этой проблемы является отладка и точное определение того, какая переменная или ссылка вызвала ошибку сериализации.

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

SerializationDebugger:java.lang.StackOverflowError

Вы также можете отключить его, включив флаги расширенной отладочной информации в JVM, задав следующие свойства в Конфигурации Spark при создании кластера или добавив их в spark-submit параметры

spark.driver.extraJavaOptions -Dsun.io.serialization.extendedDebugInfo=true
spark.executor.extraJavaOptions -Dsun.io.serialization.extendedDebugInfo=true

Во-вторых, если вы развертываете задание Spark в режиме YARN, иногда вы не можете получить журнал (распечатать на консоли) для заданий executors. Вам нужно установить yarn.log-aggregation-enable=true в настройках вашего кластера.

После этого я надеюсь, что эти заметки помогут вам легче изучить и решить проблему с сериализацией Spark. А также большое спасибо всем авторам в приложении ниже, все ваши заметки очень помогли мне решить мою собственную проблему.

Приложение

Понравилась статья? Поделить с друзьями:
  • Исправить лексическую ошибку исключить или заменить слово
  • Исправить ошибки explorer exe
  • Исправить ошибку са2со3
  • Исправить ошибки на флешке андроид
  • Исправление и предупреждение ошибок учащихся начальных классов