# NotSerializableException



## jCoder1984 (13. Jun 2019)

Hallo zusammen ich will vom Client zum Server eine Object senden. Dazu verwende ich ObjectOutputStream.
Ich möchte gerne eine Object vom Type 


```
public interface ICreateObjectRequest extends IRequest {

    /**
     * @return a list with model data
     */
    List<IMatchData> getModelDataList();
}
```

Dazu habe ich ein konkreter Object : 

```
@AllArgsConstructor
@Getter
@EqualsAndHashCode
@Slf4j
public class CreateObjectRequest implements ICreateObjectRequest, Serializable {

    @NonNull
    private final String requestType = getClass().getSimpleName();

    @NonNull
    private final List<IMatchData> modelDataList;
}
```

Hiermit sende ich das Object an den Server :


```
// send create crate request
        IMatchData testMatchData = TestMatchData.builder().build();
        List<IMatchData> dataList = Lists.newArrayList(testMatchData);
        response = client.sendAndWait(new CreateObjectRequest(dataList));
```

Hier ist noch die Definition der TestMatchData : 

```
@Builder
@Getter
@Slf4j
public class TestMatchData implements IMatchData, Serializable {

    @Builder.Default
    private Optional<String> seasonSeperator = Optional.ofNullable("/");
    @Builder.Default
    private Optional<String> season = Optional.empty();

    @Builder.Default
    private Optional<String> associationName = Optional.empty();

    @Builder.Default
    private Optional<String> competitionName = Optional.empty();

    @Builder.Default
    private Optional<String> competitionRoundName = Optional.empty();

    @Builder.Default
    private Optional<String> matchDayName = Optional.empty();

    @Builder.Default
    private Optional<String> number = Optional.empty();

    @Builder.Default
    private Optional<DateTimeFormatter> matchDateTimeFormat = Optional.ofNullable(DateTimeFormatter.ofPattern("dd-MM-YYYY HH:mm"));
    @Builder.Default
    private Optional<String> dateTime = Optional.empty();

    @Builder.Default
    private Optional<String> team1Name = Optional.empty();

    @Builder.Default
    private Optional<String> team2Name = Optional.empty();

    @Builder.Default
    private Optional<String> result = Optional.empty();
}
```


Wenn ich nun die Daten schicke, bkommen ich die folgende Fehlermeldung : 

```
java.io.NotSerializableException: java.util.Optional
```

Ich habe mal versucht anstatt von IMatchData Integer Objekte zu schicken - also eine List mit Integer Objketen. das hat problemlos funktioniert.

Kann mir jemand einen Tipp geben?
Vielen Dank


----------



## kneitzel (13. Jun 2019)

Also Ursache sollte klar sein: Du versuchst Dinge über den Stream zu schicken, die nicht geschickt werden können. Siehe hier Serializable.

Daher kommt die Exception: NotSerializableException und der Typ der Probleme macht wird auch genannt: Optional.

Und da kommen wir zu einem etwas älteren Thema: 

Das Thema wurde damals von der Gruppe um JSR-335 betrachtet mit einem relativ klaren Ergebnis: http://mail.openjdk.java.net/pipermail/jdk8-dev/2013-September/003274.html

Hintergrund ist, dass Optional dazu gedacht ist als Rückgabewert zu dienen, wenn es ggf auch keine Rückgabe gibt. Siehe dazu auch
http://mail.openjdk.java.net/pipermail/lambda-dev/2012-September/005952.html
http://mail.openjdk.java.net/pipermail/lambda-libs-spec-experts/2013-May/001814.html

Bei letzterem Link gefällt mir ganz gut: "do things that encourage people to use Optional only in return position."

Möglichkeiten, die mir auf die Schnelle einfallen:
- Evtl. Optional nicht zur Datenspeicherung nutzen.
- Evtl. Optional von Guava nutzen: https://google.github.io/guava/releases/19.0/api/docs/com/google/common/base/Optional.html
- Evtl. die Serialisierung manuell machen https://dzone.com/articles/serializing-java-objects-non


----------

