Skip to content

Ambiguous serialization #27

@asmodehn

Description

@asmodehn

It seems the union is ambiguous, ie it is not tagged...
As a result :

Python 3.7.5 (default, Nov 20 2019, 09:21:52) 
Type 'copyright', 'credits' or 'license' for more information
IPython 7.10.1 -- An enhanced Interactive Python. Type '?' for help.
PyDev console: using IPython 7.10.1

Python 3.7.5 (default, Nov 20 2019, 09:21:52) 
[GCC 9.2.1 20191008] on linux
from marshmallow_union import Union
from marshmallow import fields
u = Union(fields=[fields.Integer(), fields.String()])
u.serialize('v', {'v': 0})
# 0
u.serialize('v', {'v': '0'})
# 0
u.deserialize('0')
# 0
u.deserialize(0)
# 0
u.deserialize(u.serialize('v', {'v': '0'})) == u.deserialize(u.serialize('v', {'v': 0}))
# True
'0' == 0
# False

For reference, with pure marshmallow, serialization can be abused, but deserialization is always correct.

f = fields.Integer()
f.serialize('v', {'v': 0})
# 0
f.serialize('v', {'v': '0'})
# 0
f.deserialize(f.serialize('v', {'v': '0'})) == 0
# True
f.deserialize(f.serialize('v', {'v': 0})) == 0
# True
f.deserialize(f.serialize('v', {'v': '0'})) == '0'
# False
f.deserialize(f.serialize('v', {'v': 0})) == '0'
# False

f = fields.String()
f.deserialize(f.serialize('v', {'v': 0})) == '0'
# True
f.deserialize(f.serialize('v', {'v': 0})) == 0
# False

Thoughts ?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions