Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement java.io.Serializable for some of the classes #373

Open
wants to merge 3 commits into
base: master
Choose a base branch
from

Conversation

dkhalanskyjb
Copy link
Contributor

Implement java.io.Serializable for

  • Instant
  • LocalDate
  • LocalTime
  • LocalDateTime
  • UtcOffset

TimeZone is not Serializable because its behavior is system-dependent. We can make it java.io.Serializable later if there is demand.

We are using string representations instead of relying on Java's entities being java.io.Serializable so that we have more freedom to change our implementation later.

Fixes #143

@Moozart
Copy link

Moozart commented Apr 9, 2024

Can you please merge this commit if possible? @ilya-g

Copy link
Member

@ilya-g ilya-g left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For better control over serialized representation I would suggest using writeReplace/readResolve with an Externalizable container.

@@ -111,6 +113,25 @@ public actual class Instant internal constructor(internal val value: jtInstant)

internal actual val MIN: Instant = Instant(jtInstant.MIN)
internal actual val MAX: Instant = Instant(jtInstant.MAX)

@JvmStatic
private val serialVersionUID: Long = 1L
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We usually use const val for that.

@dkhalanskyjb
Copy link
Contributor Author

I don't understand the idea. Do you mean that LocalTime should be Externalizable?

From the docs (https://docs.oracle.com/javase%2F7%2Fdocs%2Fapi%2F%2F/java/io/Externalizable.html):

When an Externalizable object is reconstructed, an instance is created using the public no-arg constructor

But we don't have public no-arg constructors. I guess we could do something like class LocalTime { @PublishedApi internal constructor() }, which would make it a public constructor for the JVM, and trick Kotlin somehow to avoid initializing val value: java.time.LocalTime in that constructor, but is it worth it to make such intrusive changes just to support Java serialization?

@akhbulatov
Copy link

A very necessary implementation on Android to be able to pass LocalDate/LocalDateTime objects between screens

@dkhalanskyjb
Copy link
Contributor Author

@akhbulatov, it's not "necessary", just convenient: see #143 (comment)

Implement java.io.Serializable for
* Instant
* LocalDate
* LocalTime
* LocalDateTime
* UtcOffset

TimeZone is not `Serializable` because its behavior is
system-dependent. We can make it `java.io.Serializable` later
if there is demand.

We are using string representations instead of relying on Java's
entities being `java.io.Serializable` so that we have more freedom
to change our implementation later.

Fixes #143
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Implement java.io.Serializable on the JVM
4 participants