{"record":{"id":"098890bae0362ada","repo":"apache/incubator-seata","slug":"since-fst-is-no-longer-maintained-this-serializat","errorCode":null,"errorMessage":"Since fst is no longer maintained, this serialization extension has been removed from version 2.0 for security and stability reasons.","messagePattern":"Since fst is no longer maintained, this serialization extension has been removed from version 2\\.0 for security and stability reasons\\.","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"core/src/main/java/org/apache/seata/core/serializer/SerializerType.java","lineNumber":96,"sourceCode":"\n    SerializerType(final byte code) {\n        this.code = code;\n    }\n\n    /**\n     * Gets result code.\n     *\n     * @param code the code\n     * @return the result code\n     */\n    public static SerializerType getByCode(int code) {\n        for (SerializerType b : SerializerType.values()) {\n            if (code == b.code) {\n                return b;\n            }\n        }\n        if (code == SerializerType.FST.getCode()) {\n            throw new IllegalArgumentException(\n                    \"Since fst is no longer maintained, this serialization extension has been removed from version 2.0 for security and stability reasons.\");\n        }\n        throw new IllegalArgumentException(\"unknown codec:\" + code);\n    }\n\n    /**\n     * Gets result code.\n     *\n     * @param name the name\n     * @return the result code\n     */\n    public static SerializerType getByName(String name) {\n        for (SerializerType b : SerializerType.values()) {\n            if (b.name().equalsIgnoreCase(name)) {\n                return b;\n            }\n        }\n        throw new IllegalArgumentException(\"unknown codec:\" + name);","sourceCodeStart":78,"sourceCodeEnd":114,"githubUrl":"https://github.com/apache/incubator-seata/blob/e01f97c6db397165050caa6764020410c2c8199a/core/src/main/java/org/apache/seata/core/serializer/SerializerType.java#L78-L114","documentation":"SerializerType.getByCode(int) maps a wire/config codec number back to a SerializerType enum. Since FST serialization was removed in Seata 2.0 (unmaintained, security issues), code 0x0B no longer matches any enum value, so the method detects the legacy FST code and throws IllegalArgumentException explaining the removal. It is a deliberate migration fence, not a generic lookup failure.","triggerScenarios":"SerializerType.getByCode(FST code) — decoding an RPC frame or persisted record whose header still carries the FST codec byte (old 1.x peer or old data), or config still specifying fst, while running a 2.x+ build where the FST enum value no longer exists.","commonSituations":"Rolling upgrade where a 1.x client/server (serialization=fst) talks to a 2.x server; replaying transaction/branch records serialized with FST before the upgrade; configuration left at serialization=fst copied from a 1.x deployment.","solutions":["Upgrade remaining 1.x peers to Seata 2.x so no side advertises FST.","Change serialization config from fst to seata (or another supported codec) on all clients and the server, then restart the whole cluster.","Drain or delete pre-upgrade FST-serialized persistent data (e.g. old undo logs / stored records) before pointing 2.x at it.","If a 1.x client cannot be upgraded, run a matching 1.x server for it instead of forcing mixed versions."],"exampleFix":"# before (file.conf, seata 1.x)\nclient {\n  serialization = \"fst\"\n}\n\n# after (seata 2.x)\nclient {\n  serialization = \"seata\"\n}","handlingStrategy":"validation","validationCode":"// before decoding a stored/legacy codec code\nint code = readCodecCode();\nif (code == 0x0B /* legacy FST code, SerializerType.FST.getCode() in 1.x */) {\n    throw new UnsupportedOperationException(\n        \"FST serialization was removed in Seata 2.0 - re-encode data with 'seata' serialization\");\n}\nSerializerType type = SerializerType.getByCode(code);","typeGuard":null,"tryCatchPattern":"try {\n    SerializerType t = SerializerType.getByCode(code);\n} catch (IllegalArgumentException e) {\n    if (e.getMessage().contains(\"fst\")) {\n        // data/peer from 1.x: block and require migration, do not retry\n        throw new MigrationRequiredException(\"FST peer/data detected - upgrade to Seata 2.x protocol\", e);\n    }\n    throw e;\n}","preventionTips":["Before a 2.x upgrade, sweep configs for serialization=fst on clients and server and switch to seata.","Drain FST-encoded persisted state during the upgrade window.","Run mixed-version acceptance tests only with the seata codec, never fst."],"tags":["serialization","fst","version-migration","upgrade","removed-feature"],"backgroundTag":null,"analyzedSha":"e01f97c6db397165050caa6764020410c2c8199a","analyzedAt":"2026-08-14T10:23:53.097Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}