7979_T = TypeVar ("_T" , Dict [str , Any ], Optional [Dict [str , Any ]])
8080
8181
82+ def _rebuild_pkt (
83+ cls , # type: Type[Packet]
84+ fields , # type: Dict[str, Any]
85+ payload , # type: Optional[Packet]
86+ metadata , # type: Dict[str, Any]
87+ ):
88+ # type: (...) -> Packet
89+ """Helper for unpickling Packet instances via field values."""
90+ # Create the instance using the field values
91+ pkt = cls (** fields )
92+ if payload is not None :
93+ pkt .add_payload (payload )
94+ # Restore metadata
95+ pkt .time = metadata ['time' ]
96+ pkt .sent_time = metadata ['sent_time' ]
97+ pkt .direction = metadata ['direction' ]
98+ pkt .sniffed_on = metadata ['sniffed_on' ]
99+ pkt .wirelen = metadata ['wirelen' ]
100+ pkt .comments = metadata ['comments' ]
101+ return pkt
102+
103+
82104class Packet (
83105 BasePacket ,
84106 _CanvasDumpExtended ,
@@ -214,15 +236,6 @@ def __init__(self,
214236 else :
215237 self .post_transforms = [post_transform ]
216238
217- _PickleType = Tuple [
218- Union [EDecimal , float ],
219- Optional [Union [EDecimal , float , None ]],
220- Optional [int ],
221- Optional [_GlobInterfaceType ],
222- Optional [int ],
223- Optional [bytes ],
224- ]
225-
226239 @property
227240 def comment (self ):
228241 # type: () -> Optional[bytes]
@@ -244,27 +257,32 @@ def comment(self, value):
244257 self .comments = None
245258
246259 def __reduce__ (self ):
247- # type: () -> Tuple[Type[Packet], Tuple[bytes], Packet._PickleType]
248- """Used by pickling methods"""
249- return (self .__class__ , (self .build (),), (
250- self .time ,
251- self .sent_time ,
252- self .direction ,
253- self .sniffed_on ,
254- self .wirelen ,
255- self .comment
256- ))
257-
258- def __setstate__ (self , state ):
259- # type: (Packet._PickleType) -> Packet
260- """Rebuild state using pickable methods"""
261- self .time = state [0 ]
262- self .sent_time = state [1 ]
263- self .direction = state [2 ]
264- self .sniffed_on = state [3 ]
265- self .wirelen = state [4 ]
266- self .comment = state [5 ]
267- return self
260+ # type: () -> Tuple[Any, ...]
261+ """Used by pickling methods.
262+
263+ Reconstructs the packet from field values, payload, and metadata.
264+ """
265+ # Store field values for unpickling
266+ fields = {}
267+ for f in self .fields_desc :
268+ if f .name in self .fields :
269+ fields [f .name ] = self .fields [f .name ]
270+ payload = self .payload # type: Optional[Packet]
271+ if isinstance (payload , NoPayload ):
272+ payload = None
273+ # Store metadata for unpickling
274+ metadata = {
275+ 'time' : self .time ,
276+ 'sent_time' : self .sent_time ,
277+ 'direction' : self .direction ,
278+ 'sniffed_on' : self .sniffed_on ,
279+ 'wirelen' : self .wirelen ,
280+ 'comments' : self .comments ,
281+ }
282+ return (
283+ _rebuild_pkt ,
284+ (self .__class__ , fields , payload , metadata ),
285+ )
268286
269287 def __deepcopy__ (self ,
270288 memo , # type: Any
0 commit comments