Как сериализовать объект, метод которого имеет несколько параметров - PullRequest
0 голосов
/ 10 октября 2019

Я новичок в Java, и мне нужна помощь. У меня есть два класса, один (Песня) см. Код - Дитя второго (Дата). Песня сериализуема, а Дата не сериализуема (и я намерен сохранить класс Date таким образом). Я использую метод из 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;
  }
  }
 }

1 Ответ

0 голосов
/ 10 октября 2019

Если тип Date предлагает только дату String, то вам нужно будет передать ее в какой-то момент. Либо синтаксический анализ в writeObject и сохранение int s, либо сохранение в String является последовательной формой, а синтаксический анализ в readObject.

Date только с предложением строковой даты, вероятно, нехороший выбор дизайна. Также нет никакого способа, которым Song должен быть подтипом Date (если нет некоторой критической проблемы производительности, которая кажется маловероятной).

Также избегайте Сериализации Java. JSON кажется обычной альтернативой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...