Skip to content

This issue was moved to a discussion.

You can continue the conversation there. Go to discussion →

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

How to boost::serialize S2PointIndex #332

Closed
GoroYeh-HRI opened this issue Oct 31, 2023 · 5 comments
Closed

How to boost::serialize S2PointIndex #332

GoroYeh-HRI opened this issue Oct 31, 2023 · 5 comments

Comments

@GoroYeh-HRI
Copy link

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
Copy link
Collaborator

smcallis commented Oct 31, 2023 via email

@GoroYeh-HRI
Copy link
Author

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
Copy link
Collaborator

smcallis commented Nov 1, 2023

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
Copy link
Author

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
Copy link
Collaborator

smcallis commented Nov 1, 2023

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.

@google google locked and limited conversation to collaborators Jan 27, 2024
@jmr jmr converted this issue into discussion #342 Jan 27, 2024

This issue was moved to a discussion.

You can continue the conversation there. Go to discussion →

Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants