You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Golang中反序列化Python Pickle对象?

How to Deserialize Python Pickle Objects in Go

Absolutely doable! Python's Pickle format is Python-specific, but there are Go libraries that handle deserialization for most common cases. Let's break this down with a practical example.

1. Know the Limitations First

Before diving in, keep in mind a few key points:

  • Simple types (strings, integers, lists, dicts, nested basic structures) work smoothly with most Go parsers.
  • Custom Python classes require you to map their attributes to a corresponding Go struct—field names should align (or you can use struct tags to map mismatched names).
  • Complex Python-specific types like generators, lambdas, or objects with circular references might not be supported by standard Go Pickle libraries.

2. Use a Go Pickle Parsing Library

The most reliable library I’ve used for this task is stalecucumber—it’s built specifically to read Pickle data in Go. Install it first via:

go get github.com/hydrogen18/stalecucumber

3. Step-by-Step Example

Step 1: Generate a Pickle File in Python

First, let’s create a simple Python script that serializes an object (mix of basic types and a custom class) to a Pickle file:

import pickle

# A simple custom Python class
class User:
    def __init__(self, name, age, preferences):
        self.name = name
        self.age = age
        self.preferences = preferences

# Create an object to serialize
user_data = User(
    name="Alice",
    age=30,
    preferences={"theme": "dark", "notifications": True}
)

# Save to a pickle file
with open("user_data.pkl", "wb") as f:
    pickle.dump(user_data, f)

Run this script to generate user_data.pkl.

Step 2: Deserialize the Pickle File in Go

Now, write a Go program that reads this Pickle file and maps the data to a Go struct. For the custom User class, we’ll define a matching struct with optional tags to align field names:

package main

import (
	"fmt"
	"os"

	"github.com/hydrogen18/stalecucumber"
)

// Go struct matching the Python User class attributes
type User struct {
	Name        string                 `pickle:"name"`
	Age         int                    `pickle:"age"`
	Preferences map[string]interface{} `pickle:"preferences"`
}

func main() {
	// Open the pickle file
	file, err := os.Open("user_data.pkl")
	if err != nil {
		fmt.Printf("Failed to open file: %v\n", err)
		return
	}
	defer file.Close()

	// Initialize Pickle decoder
	decoder := stalecucumber.NewDecoder(file)

	// Decode data into our User struct
	var user User
	err = decoder.Decode(&user)
	if err != nil {
		fmt.Printf("Failed to decode pickle data: %v\n", err)
		return
	}

	// Print the decoded result
	fmt.Printf("Decoded User:\n")
	fmt.Printf("Name: %s\n", user.Name)
	fmt.Printf("Age: %d\n", user.Age)
	fmt.Printf("Preferences: %v\n", user.Preferences)
}

Run this Go program, and you’ll see the full decoded user data printed to the console.

4. Handling Edge Cases

  • Nested lists and dicts from Pickle will automatically map to Go slices and maps.
  • For Python enums or less common types, you may need to add custom parsing logic—check the library’s documentation for supported types.
  • Test with your specific Pickle data first: older Pickle protocols might require extra configuration in the decoder.

Content of the question comes from Stack Exchange, asked by Vasanti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:52:17