2014-01-17 1 views
0

Я новичок в концепции сериализации, и я пытаюсь сериализовать класс PointF, поскольку мне нужно отправить его через соединение сокетов (я использую ObjectOutputStream и ObjectInputStream). Моя проблема заключается в отправке независимо от того, какие значения у меня есть в объекте PointF при отправке, после получения я получаю значение по умолчанию.Serialize Point, PointF Objects

пример, если я отправил pointF (1.0.4.0), я получаю (0.0.0.0).

Ниже приведен мой код для внедрения сериализации.

public class MyPointF extends PointF implements Serializable { 

/** 
* 
*/ 
private static final long serialVersionUID = -455530706921004893L; 

public MyPointF() { 
    super(); 
} 

public MyPointF(float x, float y) { 
    super(x, y); 
} 
} 

Может кто-нибудь указать на проблему? Кроме того, после небольшого поиска я обнаружил, что эта вещь происходит и с классом android.canvas.Path. Пожалуйста, поправьте меня, где я ошибаюсь.

ответ

1

Ваш суперкласс PointF не является сериализуемым. Это означает, что применяется следующее:

Чтобы подтипы несериализуемых классов для сериализации, подтип может взять на себя ответственность за сохранение и восстановление состояния общественности супертипе, в защите, и (если доступно) пакет полей , Подтип может взять на себя эту ответственность, только если класс, который он расширяет, имеет доступный конструктор no-arg для инициализации состояния класса. Ошибка объявить класс Serializable, если это не так. Ошибка будет обнаружена во время выполнения.

Во время десериализации поля классов, не подлежащих сериализации, будут инициализированы с использованием открытого или защищенного конструктора no-arg класса. Конструктор no-arg должен быть доступен для подкласса, который является сериализуемым. Поля сериализуемых подклассов будут восстановлены из потока.

См: http://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html

Вам нужно будет посмотреть на readObject и writeObject:

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

private void writeObject(java.io.ObjectOutputStream out) 
    throws IOException 
private void readObject(java.io.ObjectInputStream in) 
    throws IOException, ClassNotFoundException; 

См. Также здесь: Java Serialization with non serializable parts для получения дополнительных советов и рекомендаций.

+0

Thanx за ссылку. –

0

Я, наконец, нашел решение. Thanx @Greg и другие комментарии, которые были удалены. Решение состоит в том, что вместо расширения этих объектов мы можем создавать объекты-заглушки. Поскольку я вызывал super из конструктора, поля x и y были унаследованы от базового класса, который не является сериализуемым. поэтому они не были сериализованы, и значения не были отправлены.

так я mofidfied мой класс в соответствии с вашими предложениями

public class MyPointF implements Serializable { 

/** 
* 
*/ 
private static final long serialVersionUID = -455530706921004893L; 

public float x; 
public float y; 

public MyPointF(float x, float y) { 
    this.x = x; 
    this.y = y; 
} 
} 
+0

Почему этого достаточно? Вам действительно не нужно реализовывать 'writeObject()' и 'readObject()'? – cgogolin

Смежные вопросы