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

Field is not serializable with binary formats #3082

Closed
bjchambers opened this issue Nov 10, 2022 · 3 comments · Fixed by #3126
Closed

Field is not serializable with binary formats #3082

bjchambers opened this issue Nov 10, 2022 · 3 comments · Fixed by #3126
Labels
arrow Changes to the arrow crate bug good first issue Good for newcomers help wanted

Comments

@bjchambers
Copy link
Contributor

This one took some time to track down. I was working on snapshotting some state in my system and it kept throwing errors while deserializing. I eventually determined this is because of the skip_serializing_if on the Field::metadata. Specifically, it seems to be triggering serde-rs/serde#1732.

As best I can tell, the issue is that the binary format needs to have something written to say "this is None" so it can know to move on to other things.

Sure enough, with both bincode and postcard (didn't test others) the following tests fail 2 out of 3:

    #[cfg(feature = "serde")]
    fn assert_binary_serde_round_trip(field: Field) {
        let serialized = postcard::to_stdvec(&field).unwrap();
        let deserialized: Field = postcard::from_bytes(&serialized).unwrap();
        assert_eq!(field, deserialized)
    }

    #[cfg(feature = "serde")]
    #[test]
    fn test_field_without_metadata_serde() {
        let field = Field::new("name", DataType::Boolean, true);
        assert_binary_serde_round_trip(field)
    }

    #[cfg(feature = "serde")]
    #[test]
    fn test_field_with_empty_metadata_serde() {
        let field = Field::new("name", DataType::Boolean, false)
            .with_metadata(Some(BTreeMap::new()));

        let field = Field::new("name", DataType::Boolean, true);
        assert_binary_serde_round_trip(field)
    }

    #[cfg(feature = "serde")]
    #[test]
    fn test_field_with_nonempty_metadata_serde() {
        let mut metadata = BTreeMap::new();
        metadata.insert("hi".to_owned(), "".to_owned());
        let field =
            Field::new("name", DataType::Boolean, false).with_metadata(Some(metadata));

        let field = Field::new("name", DataType::Boolean, true);
        assert_binary_serde_round_trip(field)
    }

This may be "working as intended" if the only use of serde on Fields is supposed to be JSON and other "self describing" formats. But I thought I would at least file this for discussion to see if it would be better to drop the skip_serializing_if from the metadata (although given that the empty case also fails, that may not be enough).

@bjchambers bjchambers added the bug label Nov 10, 2022
@tustvold
Copy link
Contributor

Removing the skip_serializing_if changes the output from

{"Struct":[{"name":"first_name","data_type":"Utf8","nullable":false,"dict_id":0,"dict_is_ordered":false,"metadata":{"k":"v"}},{"name":"last_name","data_type":"Utf8","nullable":false,"dict_id":0,"dict_is_ordered":false},{"name":"address","data_type":{ ...

To

{"Struct":[{"name":"first_name","data_type":"Utf8","nullable":false,"dict_id":0,"dict_is_ordered":false,"metadata":{"k":"v"}},{"name":"last_name","data_type":"Utf8","nullable":false,"dict_id":0,"dict_is_ordered":false,"metadata":null},{"name":"addres ...``

I see no issue with this

@tustvold
Copy link
Contributor

Also possibly related, filed #3086

tustvold pushed a commit that referenced this issue Nov 21, 2022
* remove skip_serializing_if to please postcard

* add serde postcard roundtrip tests

* fix formatting issues

* use bincode for serialization tests

Co-authored-by: askoa <askoa@local>
@alamb
Copy link
Contributor

alamb commented Nov 25, 2022

label_issue.py automatically added labels {'arrow'} from #3126

@alamb alamb added the arrow Changes to the arrow crate label Nov 25, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
arrow Changes to the arrow crate bug good first issue Good for newcomers help wanted
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants