google / s2geometry

Computational geometry and spatial indexing on the sphere
http://s2geometry.io/
Apache License 2.0
2.29k stars 302 forks source link

How to boost::serialize S2PointIndex #332

Closed GoroYeh-HRI closed 7 months ago

GoroYeh-HRI commented 10 months ago

Hi,

If I want to use boost::serialize() to store class S2PointIndex as binary stream, how do I do it? Do I need to implement my own serialization function for S2PointIndex ? Thanks.

smcallis commented 10 months ago

It looks like we don't have an Encode() method on that one, so I think the answer is yes. Fortunately it's pretty simple under the hood.

On Tue, Oct 31, 2023 at 3:47 PM GoroYeh-HRI @.***> wrote:

Hi,

If I want to use boost::serialize() to store class S2PointIndex as binary stream, how do I do it? Do I need to implement my own serialization function for S2PointIndex ? Thanks.

— Reply to this email directly, view it on GitHub https://github.com/google/s2geometry/issues/332, or unsubscribe https://github.com/notifications/unsubscribe-auth/AAGEMKT7NZFWQI5R7IH34DDYCFWWJAVCNFSM6AAAAAA6YMF2FGVHI2DSMVQWIX3LMV43ASLTON2WKOZRHE3TCMZUHA2DEMI . You are receiving this because you are subscribed to this thread.Message ID: @.***>

GoroYeh-HRI commented 10 months ago

Hi @smcallis , thanks for your reply. Could you elaborate more on the way to do it?

I'm currently tracing class S2PointIndex and think I need to serialize S2Point, S2CellId, and s2internal::BTreeMultimap. The last one BTreeMultimap is a little bit complicated, so I'm stuck at this point.

Could you provide more details on how to implement serialize() function for this class? Thank you very much!

smcallis commented 10 months ago

S2Point and S2CellId already have Encode/Init methods so they can serialize themselves for you. s2internal::BTreeMultimap is just absl::btree_multimap. I'd probably just iterate that container and store pairs of (S2CellId, [list of data]), then read that back into a new absl::btree_multimap when decoding. That might not be the absolute most efficient encoding space-wise but it is simple. I'd worry more about the fact that PointIndex takes a template parameter for the data, so you'll have to serialize the data type too.

GoroYeh-HRI commented 10 months ago

S2Point and S2CellId already have Encode/Init methods so they can serialize themselves for you. s2internal::BTreeMultimap is just absl::btree_multimap. I'd probably just iterate that container and store pairs of (S2CellId, [list of data]), then read that back into a new absl::btree_multimap when decoding. That might not be the absolute most efficient encoding space-wise but it is simple. I'd worry more about the fact that PointIndex takes a template parameter for the data, so you'll have to serialize the data type too.

Thank you so much for your reply! So your point is, for S2Point and S2CellId I don't need to write any codes to serialize them? And for s2internal::BTreeMultimap, in addition to the container I need to handle the parameter.

I noticed the BTreeMultimap is instantiated like this: container_internal::btree<container_internal:: map_params<Key, Value, Compare, Alloc,/*TargetNodeSize=*/256,/*IsMulti=*/true>>

Did you mean I'll need to serialize map_params<> ? I noticed map_params inherits common_params which inherits common_policy_traits. I wonder how deep I should trace in order to successfully store all the necessary data. Thank you!

smcallis commented 10 months ago

You'll have to write code to hook S2Point and S2CellId into boost::serialize, but you can probably do that using their existing Encode/Init methods. I don't think you'll need to worry about storing the map params, that's a runtime detail different from storing the data in a serialized form.