[ https://issues.apache.org/jira/browse/THRIFT-5885?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Adrian Stachlewski updated THRIFT-5885: --------------------------------------- Description: When using {{{}TBinaryProtocolAccelerated{}}}, {{IntEnum}} fields are incorrectly deserialized to {{{}None{}}}. This issue occurs when the {{read}} function is executed via {{{}_fast_decode{}}}. In this path, the custom deserialization logic {{CustomEnum(iprot.readI32())}} is skipped. Instead, an integer value ({{{}i32{}}}) is directly passed to __ {{{}__{}}}{{{}setattr__{}}}, where the value is resolved using: {code:java} Operation.__members__.get(value) {code} However, __members__ maps enum names (not values) to enum members, which results in the call returning None. This leads to the enum field being set to None instead of the expected enum instance. A minimal and effective fix could be to update the __setattr__ method logic to: {code:java} if name == "enum_field": super().__setattr__(name, value if hasattr(value, 'value') or value is None else Operation(value)) {code} This would ensure that the enum value is correctly reconstructed from its integer representation during deserialization. was: When using {{{}TBinaryProtocolAccelerated{}}}, {{IntEnum}} fields are incorrectly deserialized to {{{}None{}}}. This issue occurs when the {{read}} function is executed via {{{}_fast_decode{}}}. In this path, the custom deserialization logic {{CustomEnum(iprot.readI32())}} is skipped. Instead, an integer value ({{{}i32{}}}) is directly passed to {{{}__setattr__{}}}, where the value is resolved using: {code:java} Operation.__members__.get(value) {code} However, __members__ maps enum names (not values) to enum members, which results in the call returning None. This leads to the enum field being set to None instead of the expected enum instance. A minimal and effective fix could be to update the __setattr__ method logic to: {code:java} if name == "enum_field": super().__setattr__(name, value if hasattr(value, 'value') or value is None else Operation(value)) {code} This would ensure that the enum value is correctly reconstructed from its integer representation during deserialization. > TBinaryProtocolAccelerated incorrectly deserializes IntEnum to None > ------------------------------------------------------------------- > > Key: THRIFT-5885 > URL: https://issues.apache.org/jira/browse/THRIFT-5885 > Project: Thrift > Issue Type: Bug > Components: Python - Compiler, Python - Library > Affects Versions: 0.22.0 > Environment: thrift==0.22.0 > Reporter: Adrian Stachlewski > Priority: Major > > When using {{{}TBinaryProtocolAccelerated{}}}, {{IntEnum}} fields are > incorrectly deserialized to {{{}None{}}}. > This issue occurs when the {{read}} function is executed via > {{{}_fast_decode{}}}. In this path, the custom deserialization logic > {{CustomEnum(iprot.readI32())}} is skipped. Instead, an integer value > ({{{}i32{}}}) is directly passed to __ {{{}__{}}}{{{}setattr__{}}}, where the > value is resolved using: > {code:java} > Operation.__members__.get(value) {code} > However, __members__ maps enum names (not values) to enum members, which > results in the call returning None. This leads to the enum field being set to > None instead of the expected enum instance. A minimal and effective fix could > be to update the __setattr__ method logic to: > {code:java} > if name == "enum_field": > super().__setattr__(name, value if hasattr(value, 'value') or value is > None else Operation(value)) {code} > This would ensure that the enum value is correctly reconstructed from its > integer representation during deserialization. > -- This message was sent by Atlassian Jira (v8.20.10#820010)