Сериализация объектов использует интерфейсы Serializable и Externalizable. Объект Java является сериализуемым. если класс или любой из его суперклассов реализует либо интерфейс java.io.Serializable, либо его подчиненный интерфейс, java.io.Externalizable. Большая часть класса java является сериализуемым .
NotSerializableException
: packageName.ClassName
«Чтобы принять участие в Объект класса в процессе сериализации. Класс должен реализовывать интерфейс Serializable или Externalizable. Сериализация объекта создает поток с информацией о классах Java для сохраняемых объектов. Для сериализуемых объектов сохраняется достаточная информация для восстановления этих объектов, даже если присутствует другая (но совместимая) версия реализации класса. Интерфейс Serializable определен для идентификации классов, которые реализуют сериализуемый протокол:
package java.io;
public interface Serializable {};
InvalidClassException
«В процессе десериализации, если значение локального класса serialVersionUID отличается от соответствующего класса отправителя. то результат конфликтует как java.io.InvalidClassException: com.github.objects.User; local class incompatible: stream classdesc serialVersionUID = 5081877, local class serialVersionUID = 50818771
Для объектов Externalizable в контейнере сохраняется только идентификатор класса объекта; класс должен сохранять и восстанавливать содержимое. Интерфейс Externalizable определяется следующим образом:
package java.io;
public interface Externalizable extends Serializable
{
public void writeExternal(ObjectOutput out)
throws IOException;
public void readExternal(ObjectInput in)
throws IOException, java.lang.ClassNotFoundException;
}
OptionalDataException
«Поля ДОЛЖНЫ БЫТЬ В ОДНОМ ЗАКАЗЕ И ТИПЕ , как мы их написали вне. Если в потоке есть какое-то несоответствие типа, это генерирует Необязательное исключение DataDataException. @Override public void writeExternal(ObjectOutput out) throws IOException {
out.writeInt( id );
out.writeUTF( role );
out.writeObject(address);
}
@Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
this.id = in.readInt();
this.address = (Address) in.readObject();
this.role = in.readUTF();
}
ObjectOutput
, сериализуются. Пример «Реализует Serializable
class Role {
String role;
}
class User extends Role implements Serializable {
private static final long serialVersionUID = 5081877L;
Integer id;
Address address;
public User() {
System.out.println("Default Constructor get executed.");
}
public User( String role ) {
this.role = role;
System.out.println("Parametarised Constructor.");
}
}
class Address implements Serializable {
private static final long serialVersionUID = 5081877L;
String country;
}
Пример « реализует Externalizable
class User extends Role implements Externalizable {
Integer id;
Address address;
// mandatory public no-arg constructor
public User() {
System.out.println("Default Constructor get executed.");
}
public User( String role ) {
this.role = role;
System.out.println("Parametarised Constructor.");
}
@Override
public void writeExternal(ObjectOutput out) throws IOException {
out.writeInt( id );
out.writeUTF( role );
out.writeObject(address);
}
@Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
this.id = in.readInt();
this.address = (Address) in.readObject();
this.role = in.readUTF();
}
}
Пример
public class CustomClass_Serialization {
static String serFilename = "D:/serializable_CustomClass.ser";
public static void main(String[] args) throws IOException {
Address add = new Address();
add.country = "IND";
User obj = new User("SE");
obj.id = 7;
obj.address = add;
// Serialization
objects_serialize(obj, serFilename);
objects_deserialize(obj, serFilename);
// Externalization
objects_WriteRead_External(obj, serFilename);
}
public static void objects_serialize( User obj, String serFilename ) throws IOException{
FileOutputStream fos = new FileOutputStream( new File( serFilename ) );
ObjectOutputStream objectOut = new ObjectOutputStream( fos );
// java.io.NotSerializableException: com.github.objects.Address
objectOut.writeObject( obj );
objectOut.flush();
objectOut.close();
fos.close();
System.out.println("Data Stored in to a file");
}
public static void objects_deserialize( User obj, String serFilename ) throws IOException{
try {
FileInputStream fis = new FileInputStream( new File( serFilename ) );
ObjectInputStream ois = new ObjectInputStream( fis );
Object readObject;
readObject = ois.readObject();
String calssName = readObject.getClass().getName();
System.out.println("Restoring Class Name : "+ calssName); // InvalidClassException
User user = (User) readObject;
System.out.format("Obj[Id:%d, Role:%s] \n", user.id, user.role);
Address add = (Address) user.address;
System.out.println("Inner Obj : "+ add.country );
ois.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static void objects_WriteRead_External( User obj, String serFilename ) throws IOException {
FileOutputStream fos = new FileOutputStream(new File( serFilename ));
ObjectOutputStream objectOut = new ObjectOutputStream( fos );
obj.writeExternal( objectOut );
objectOut.flush();
fos.close();
System.out.println("Data Stored in to a file");
try {
// create a new instance and read the assign the contents from stream.
User user = new User();
FileInputStream fis = new FileInputStream(new File( serFilename ));
ObjectInputStream ois = new ObjectInputStream( fis );
user.readExternal(ois);
System.out.format("Obj[Id:%d, Role:%s] \n", user.id, user.role);
Address add = (Address) user.address;
System.out.println("Inner Obj : "+ add.country );
ois.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
@see
Также для поддержания доступности необходимо использовать это для определения кода клавиши:
c = e.which ? e.which : e.keyCode;
if (c == 13) ...
Есть ли какая-либо причина, которую необходимо сцепить и протестировать на клавишу Enter?
Не могли Вы просто добавлять a
<input type="submit" />
к Вашей форме и это имеет естественно быть отправленным, когда входят, продвинут? Вы могли даже затем сцепить форму onsubmit
действие и вызывает функцию проверки оттуда, если Вы хотели...
Вы могли даже использовать onsubmit
как тест, чтобы видеть, отправляется ли Ваша форма, но она не будет работать, если Вы звоните form.submit()
.
Вернуть false
препятствовать тому, чтобы нажатие клавиши продолжилось.
Не знайте, поможет ли это, но можно попытаться моделировать щелчок кнопки отправки, вместо того, чтобы непосредственно отправить форму. У меня есть следующий код в производстве, и это хорошо работает:
$('.input').keypress(function(e) {
if(e.which == 13) {
jQuery(this).blur();
jQuery('#submit').focus().click();
}
});
Примечание: jQuery ('#submit') .focus () делает кнопку анимационной, когда входят, нажимается.
Кроме того, для возвращения false, поскольку Jason Cohen упомянул. Вы можете иметь к также preventDefault
e.preventDefault();
Я использую сейчас
$("form").submit(function(event)
Сначала я добавил обработчик событий к кнопке отправки, что вызвало у меня ошибку.