Ошибка при сериализации DataInputStream - java.time.DateTimeException: Invalid value for MonthOfYear
Прошу Вас помочь. Есть класс, задача которого сначала сериализовать резюме, записать секции и значения в поток (метод doWrite), а потом считать эти данные и записать обратно в резюме (doRead). При проверке и выполнении Junit тестов получаю ошибку -
java.time.DateTimeException: Invalid value for MonthOfYear (valid values 1 - 12): 608622
at java.time.temporal.ValueRange.checkValidValue(ValueRange.java:311)
at java.time.temporal.ChronoField.checkValidValue(ChronoField.java:703)
at java.time.LocalDate.of(LocalDate.java:267)
at com.urise.webapp.storage.Strategy.DataStreamSerializer.readLocalDate(DataStreamSerializer.java:102)
Не могу найти ошибку...Могли бы подсказать? Спасибо!
public class DataStreamSerializer implements Serializer {
@Override
public void doWrite(Resume resume, OutputStream os) throws IOException {
try (DataOutputStream dos = new DataOutputStream(os)) {
dos.writeUTF(resume.getUuid());
dos.writeUTF(resume.getFullName());
Map<ContactType, String> contacts = resume.getContacts();
dos.writeInt(contacts.size());
for (Map.Entry<ContactType, String> entry : contacts.entrySet()) {
dos.writeUTF(entry.getKey().name());
dos.writeUTF(entry.getValue());
}
Map<SectionType, Section> sections = resume.getSections();
dos.writeInt(sections.size());
for (Map.Entry<SectionType, Section> entry : sections.entrySet()) {
SectionType sectionType = entry.getKey();
Section section = entry.getValue();
switch (sectionType) {
case PERSONAL:
case OBJECTIVE:
dos.writeUTF(sectionType.name());
dos.writeUTF(((TextSection) section).getContent());
break;
case ACHIEVEMENT:
case QUALIFICATIONS:
dos.writeUTF(sectionType.name());
List<String> list = new ArrayList<>(((ListSection) section).getItems());
dos.writeInt(list.size());
for (String s : list) {
dos.writeUTF(s);
}
break;
case EXPERIENCE:
case EDUCATION:
dos.writeUTF(sectionType.name());
List<Organization> organizationList = new ArrayList<>(((OrganizationSection) section).getOrganizations());
dos.writeInt(organizationList.size());
for (Organization o : organizationList) {
Link link = o.getHomePage();
writeLink(dos, link);
}
for (int j = 0; j < organizationList.size() - 1; j++) {
Organization.Position p = organizationList.get(j).getPositions().get(j);
writeLocalDate(dos, p.getStartDate());
writeLocalDate(dos, p.getEndDate());
dos.writeUTF(p.getTitle());
dos.writeUTF(p.getDescription() == null ? " " : p.getDescription());
}
break;
}
}
}
}
private void writeLocalDate(DataOutputStream dos, LocalDate ld) throws IOException {
dos.writeInt(ld.getYear());
dos.writeInt(ld.getMonth().getValue());
}
private void writeLink(DataOutputStream dos, Link link) throws IOException {
dos.writeUTF(link.getName());
dos.writeUTF(link.getUrl() == null ? " " : link.getUrl());
}
@Override
public Resume doRead(InputStream is) throws IOException {
try (DataInputStream dis = new DataInputStream(is)) {
String uuid = dis.readUTF();
String fullName = dis.readUTF();
Resume resume = new Resume(uuid, fullName);
int size = dis.readInt();
for (int i = 0; i < size; i++) {
resume.addContact(ContactType.valueOf(dis.readUTF()), dis.readUTF());
}
int sectionsSize = dis.readInt();
for (int i = 0; i < sectionsSize; i++) {
SectionType sectionType = SectionType.valueOf(dis.readUTF());
resume.addSections(sectionType, readSection(dis, sectionType));
}
return resume;
}
}
private LocalDate readLocalDate(DataInputStream dis) throws IOException {
return LocalDate.of(dis.readInt(), dis.readInt(), 1);
}
private List<String> doGetListSections(DataInputStream dis, int sizeList) throws IOException {
List<String> listSections = new ArrayList<>(sizeList);
for (int i = 0; i < sizeList; i++) {
listSections.add(dis.readUTF());
}
return listSections;
}
private Link getLink(DataInputStream dis) throws IOException {
return new Link(dis.readUTF(), dis.readUTF() == " " ? null : dis.readUTF());
}
private List<Organization.Position> getPositions(DataInputStream dis, int sizeOrganizationList) throws IOException {
List<Organization.Position> listPositions = new ArrayList<>(sizeOrganizationList);
for (int i = 0; i < sizeOrganizationList; i++){
listPositions.add(new Organization.Position(
readLocalDate(dis), readLocalDate(dis), dis.readUTF(), dis.readUTF()));
}
return listPositions;
}
private Section readSection(DataInputStream dis, SectionType sectionType) throws IOException {
Section section = null;
switch (sectionType) {
case PERSONAL:
case OBJECTIVE:
section = new TextSection(dis.readUTF());
break;
case ACHIEVEMENT:
case QUALIFICATIONS:
int sizeListSections = dis.readInt();
section = new ListSection(doGetListSections(dis, sizeListSections));
break;
case EXPERIENCE:
case EDUCATION:
int sizeOrganizationList = dis.readInt();
section = new OrganizationSection(new Organization(getLink(dis), getPositions(dis, sizeOrganizationList)));
}
return section;
}
}