Brian, Peter, On 09/10/2019 19:52, Brian Goetz wrote: > ... > I think there is room to support the future. Here are some ways we could > extract the state from a record for serialization: > A. Scrape the fields. > B. Call the field accessors. > C. Invoke the canonical deconstructor (when we have them.) > D. Invoke a serialization-specific pattern if there is one (when we support > them.) > Note that in a case of `record R(...) { }`, these are all the same -- the > default accessors return the field values, and the default canonical > deconstructor invokes the accessors. > Clearly, if the user provides an explicit serialization member (whatever that > looks like), we should use that in preference to "default" serialization; > this is true for classes and records alike, it's just that the default > behavior differs between classes and records. So when we get to New And > Improved Serialization, D presents no migration problem; we can say "if there > is a serialization pattern, use that, otherwise..."
Sure, makes sense. > We can make the same argument for C, since in the absence of an explicit > dtor, which you can't write now, what you'd get from an implicit dtor is the > result of B. Same story: "if there is a canonical ctor, use that." Agreed. So we can effectively decouple C & D from this discussion. Great. > The real question is A vs B. One can make an argument that serialization is > about raw object state, which means that field-scraping is OK. Or one can > make the argument that we are trying to make serialization safer, so we > should prefer the accessor (when there is one.) Most of the time, though, if > there is a nontrivial accessor, all it will do is make a copy (say, if the > corresponding component is an array), so going through the accessor is a bit > of a wasted effort. The current wording in the draft comes from the desire to be precise on the deserializing-side, to ensure that record construction respects the object model. We may have overrotated on the serializing-side. It sounds like there is room for both A and B. The proposed draft wording ( as referenced in Peter's earlier email ), from section 1.13 "Serialization of Records" [1] is: "The serialized form of a record object is a sequence of values derived from the final instance fields of the object." This is not wrong ( remember the serialized-form is a description of the on-wire representation, not a description of how to derive the actual values ), but the word could be improved. Suggest: "The serialized form of a record object is a sequence of values derived from the record components." The other area of the proposed draft spec where this impacts ( as referenced in Peter's earlier email ), is 2.1 "The ObjectOutputStream Class” [2]: "The components of the record object are written to the stream. a. If the record object is serializable or externalizable, the record components are written, as if by invoking the `defaultWriteObject` method. … " I think that this is ok as is. It leave room for both A and B. -Chris. [1] https://cr.openjdk.java.net/~chegar/records/spec/records-serialization.03.html#serialization-of-records [2] http://corelibs-linux-1.ie.oracle.com/~chhegar/webrevs/sv2/record/spec/records-serialization.html#the-objectoutputstream-class