java - 如何序列化其方法有多个参数的对象

标签 java parameters java-custom-serialization

我是java初学者,我需要帮助。我有两个类,一个(歌曲)参见代码是第二个(日期)的子类。歌曲是可序列化的,而日期是不可序列化的(我打算保持日期类的这种方式)。我使用 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 方法返回一个字符串,而 setDateOpen 需要 3 个整数。有没有办法让 readObjects() 读取 3 个整数并仍然输出序列化字符串? (iv'e还包括我的老师说不要改变的日期类)

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 - 如何序列化其方法有多个参数的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58326144/

相关文章:

java - 访问配置文件的 Maven 习惯用法是什么?

java - 如何在 Android Google Maps v2 中创建带有传感器方位的位置箭头标记?

java - 从Java中的线程调用JMX连接?

java - 构造函数中的对象参数

javascript - 通过 JS 解析 URL 参数,但仅将前八个字符作为值添加到 HTML 表单中

ruby-on-rails - 如何在 Rails 中 POST/PUT 数组参数

java - 自定义 BeanPropertyFilter - 仅序列化字符串的一部分

java - 流创建一个额外的列表 - 如何避免

java - 除了给出 transient 关键字之外,我们可以拒绝 java 对象的序列化吗

java - 通过自定义序列化模拟java对象外部化