如何序列化它的方法具有多个参数的 object
How to serialize an object which it's method has multiple parameters
我是 java 的初学者,我需要帮助。我有两个 classes,一个 (Song) see code 是第二个 (Date) 的 Child。 Song 是可序列化的,而 Date 是不可序列化的(我打算以这种方式保留 Date class)。我正在使用 Date 中名为 setDate 的方法,它采用三个参数,月、日和年,均为整数。我正在尝试使用自定义序列化(使用 readObject 和 writeObject 方法等)。
package assignment7;
import java.io.IOException;
import java.io.NotSerializableException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
/**
*
* @author Owner
*/
public class Song extends Date implements Serializable{
private String title;
private String artist;
private String genre;
//private String dateOpened;
//private Date obj = new Date();
public Song(){
}
public void setTitle(String t) {
title = t;
}
public void setArtist(String a) {
artist = a;
}
public void setGenre(String g) {
genre = g;
}
public void setDateOpen(int m, int d, int y){
setDate(m, d, y);
}
public void setDayOpen(){
}
public void setDayOpen(){
Date
}
public void setDayOpen(){
}
public String getDateOpen(){
return getDate();
}
public String getTitle() {
return title;
}
public String getArtist() {
return artist;
}
public String getGenre() {
return genre;
}
private void writeObject( ObjectOutputStream out ) throws IOException, ClassNotFoundException, NotSerializableException {
out.defaultWriteObject();
out.writeObject(getTitle());
out.writeObject(getArtist());
out.writeObject(getGenre());
out.writeObject(getDateOpen());
}
private void readObject( ObjectInputStream in ) throws IOException, NotSerializableException, ClassNotFoundException {
in.defaultReadObject();
setTitle((String)in.readObject());
setArtist((String)in.readObject());
setGenre((String)in.readObject());
setDateOpen((int)in.readObject(), (int)in.readObject(), (int)in.readObject());
}
}
问题是 getDateOpen 方法 returns 一个字符串,而 setDateOpen 需要 3 个整数。有没有办法让 readObjects() 读取 3 个整数并仍然输出序列化字符串? (iv' 还包括日期 class,我的老师说不要更改)
package assignment7;
import java.util.Scanner;
public class Date
{
private int month;
private int day;
private int year;
public Date() { month = 0; day = 0; year = 0; }
public Date( int m, int d, int y )
{
month = editMonth( m );
day = editDay( d );
year = editYear( y );
}
public void setDate( int m, int d, int y )
{
month = editMonth( m );
day = editDay( d );
year = editYear( y );
}
public String getDate( )
{
return month + "/" + day + "/" + year;
}
public int getMonth() { return month; }
public int getDay() { return day; }
public int getYear() { return year; }
protected int editMonth( int m )
{
if( m >= 1 && m <= 12 )
return m;
else
{
Scanner input = new Scanner( System.in );
while( !( m >= 1 && m <= 12 ) )
{
System.out.print( "Month must be 1-12 --- Please re-enter: " );
m = input.nextInt();
}
return m;
}
}
protected int editDay( int d )
{
int [] monthDays = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
if( d >= 1 && d <= monthDays[month - 1] )
return d;
else
{
Scanner input = new Scanner( System.in );
while( !( d >= 1 && d <= monthDays[month - 1] ) )
{
System.out.print( "Day must be 1 - " + monthDays[month - 1] + " ---
please re-enter: " );
d = input.nextInt();
}
return d;
}
}
protected int editYear( int y )
{
if( y >= 1 )
return y;
else
{
Scanner input = new Scanner(System.in);
while( y < 1 )
{
System.out.print( "Year must be greater than 1 --- please re-enter: "
);
y = input.nextInt();
}
return y;
}
}
}
如果 Date
类型仅提供 String
日期,那么您需要在某个时候传递它。要么在writeObject
中解析并存储在int
中,要么与String
保持串行形式并在readObject
中解析。
Date
仅提供字符串化日期可能不是一个好的设计选择。此外,Song
不可能是 Date
的子类型(除非存在一些关键的性能问题,这似乎不太可能)。
同时避免Java序列化。 JSON 似乎是通常的选择。
我是 java 的初学者,我需要帮助。我有两个 classes,一个 (Song) see code 是第二个 (Date) 的 Child。 Song 是可序列化的,而 Date 是不可序列化的(我打算以这种方式保留 Date class)。我正在使用 Date 中名为 setDate 的方法,它采用三个参数,月、日和年,均为整数。我正在尝试使用自定义序列化(使用 readObject 和 writeObject 方法等)。
package assignment7;
import java.io.IOException;
import java.io.NotSerializableException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
/**
*
* @author Owner
*/
public class Song extends Date implements Serializable{
private String title;
private String artist;
private String genre;
//private String dateOpened;
//private Date obj = new Date();
public Song(){
}
public void setTitle(String t) {
title = t;
}
public void setArtist(String a) {
artist = a;
}
public void setGenre(String g) {
genre = g;
}
public void setDateOpen(int m, int d, int y){
setDate(m, d, y);
}
public void setDayOpen(){
}
public void setDayOpen(){
Date
}
public void setDayOpen(){
}
public String getDateOpen(){
return getDate();
}
public String getTitle() {
return title;
}
public String getArtist() {
return artist;
}
public String getGenre() {
return genre;
}
private void writeObject( ObjectOutputStream out ) throws IOException, ClassNotFoundException, NotSerializableException {
out.defaultWriteObject();
out.writeObject(getTitle());
out.writeObject(getArtist());
out.writeObject(getGenre());
out.writeObject(getDateOpen());
}
private void readObject( ObjectInputStream in ) throws IOException, NotSerializableException, ClassNotFoundException {
in.defaultReadObject();
setTitle((String)in.readObject());
setArtist((String)in.readObject());
setGenre((String)in.readObject());
setDateOpen((int)in.readObject(), (int)in.readObject(), (int)in.readObject());
}
}
问题是 getDateOpen 方法 returns 一个字符串,而 setDateOpen 需要 3 个整数。有没有办法让 readObjects() 读取 3 个整数并仍然输出序列化字符串? (iv' 还包括日期 class,我的老师说不要更改)
package assignment7;
import java.util.Scanner;
public class Date
{
private int month;
private int day;
private int year;
public Date() { month = 0; day = 0; year = 0; }
public Date( int m, int d, int y )
{
month = editMonth( m );
day = editDay( d );
year = editYear( y );
}
public void setDate( int m, int d, int y )
{
month = editMonth( m );
day = editDay( d );
year = editYear( y );
}
public String getDate( )
{
return month + "/" + day + "/" + year;
}
public int getMonth() { return month; }
public int getDay() { return day; }
public int getYear() { return year; }
protected int editMonth( int m )
{
if( m >= 1 && m <= 12 )
return m;
else
{
Scanner input = new Scanner( System.in );
while( !( m >= 1 && m <= 12 ) )
{
System.out.print( "Month must be 1-12 --- Please re-enter: " );
m = input.nextInt();
}
return m;
}
}
protected int editDay( int d )
{
int [] monthDays = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
if( d >= 1 && d <= monthDays[month - 1] )
return d;
else
{
Scanner input = new Scanner( System.in );
while( !( d >= 1 && d <= monthDays[month - 1] ) )
{
System.out.print( "Day must be 1 - " + monthDays[month - 1] + " ---
please re-enter: " );
d = input.nextInt();
}
return d;
}
}
protected int editYear( int y )
{
if( y >= 1 )
return y;
else
{
Scanner input = new Scanner(System.in);
while( y < 1 )
{
System.out.print( "Year must be greater than 1 --- please re-enter: "
);
y = input.nextInt();
}
return y;
}
}
}
如果 Date
类型仅提供 String
日期,那么您需要在某个时候传递它。要么在writeObject
中解析并存储在int
中,要么与String
保持串行形式并在readObject
中解析。
Date
仅提供字符串化日期可能不是一个好的设计选择。此外,Song
不可能是 Date
的子类型(除非存在一些关键的性能问题,这似乎不太可能)。
同时避免Java序列化。 JSON 似乎是通常的选择。