{"record":{"id":"c3f5ada44ddf227e","repo":"apache/cassandra","slug":"invalid-charset-bytes-accessor-tohex-value","errorCode":null,"errorMessage":"Invalid + charset + bytes + accessor.toHex(value)","messagePattern":"Invalid \\+ charset \\+ bytes \\+ accessor\\.toHex\\(value\\)","errorType":"validation","errorClass":"MarshalException","httpStatus":null,"severity":"error","filePath":"src/java/org/apache/cassandra/serializers/AbstractTextSerializer.java","lineNumber":46,"sourceCode":"\npublic abstract class AbstractTextSerializer extends TypeSerializer<String>\n{\n    private final Charset charset;\n\n    protected AbstractTextSerializer(Charset charset)\n    {\n        this.charset = charset;\n    }\n\n    public <V> String deserialize(V value, ValueAccessor<V> accessor)\n    {\n        try\n        {\n            return accessor.toString(value, charset);\n        }\n        catch (CharacterCodingException e)\n        {\n            throw new MarshalException(\"Invalid \" + charset + \" bytes \" + accessor.toHex(value));\n        }\n    }\n\n    public ByteBuffer serialize(String value)\n    {\n        return ByteBufferUtil.bytes(value, charset);\n    }\n\n\n    @Override\n    public String toString(String value)\n    {\n        return value;\n    }\n\n    public Class<String> getType()\n    {\n        return String.class;","sourceCodeStart":28,"sourceCodeEnd":64,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/serializers/AbstractTextSerializer.java#L28-L64","documentation":"AbstractTextSerializer.deserialize throws MarshalException when the byte buffer cannot be decoded with the column's charset (UTF-8 or ASCII). The bytes are not valid text for the declared type, so Cassandra refuses to return them as a string.","triggerScenarios":"Reading a column declared text/varchar/ascii whose stored bytes are not valid for the charset — e.g. blob data inserted via a BlobType column then read as text, arbitrary binary values written with wrong typing, or ascii columns containing bytes >127 (src/java/org/apache/cassandra/serializers/AbstractTextSerializer.java:46).","commonSituations":"Applications writing blobs into text columns via driver type coercion; importing data with sstableloader using a mismatched schema; latin-1/binary bytes written to a UTF-8 column; ascii columns receiving UTF-8 multibyte characters.","solutions":["Fix the schema: declare the column as blob if it stores binary data, or fix the writer to send valid charset-encoded strings.","For ascii columns that need non-ASCII characters, alter the column to text.","At the read site, catch MarshalException and inspect value bytes with ByteBufferUtil.bytesToHex to diagnose the encoding.","Re-encode offending data (rewrite the partition) after correcting the writer."],"exampleFix":"// before (client writing raw bytes as text)\nsession.execute(\"INSERT INTO t (k, v) VALUES (?, ?)\", k, someBinaryBytes); // MarshalException on read\n// after\nsession.execute(\"INSERT INTO t (k, v) VALUES (?, ?)\", k, new String(bytes, StandardCharsets.UTF_8));\n// or ALTER TABLE t ALTER v TYPE blob;","handlingStrategy":"validation","validationCode":"boolean isValidText = Charset.forName(charset).newEncoder().canEncode(stringValue);","typeGuard":"static boolean isAsciiSafe(String s) { return s.chars().allMatch(c -> c < 128); }","tryCatchPattern":"try { String s = textType.getSerializer().deserialize(value); } catch (MarshalException e) { logCorruptValue(value, e); }","preventionTips":["Declare columns as blob for binary data, text for UTF-8 strings","Use typed driver setters rather than raw bytes for string columns","Never insert arbitrary binary into text/ascii columns","Convert legacy latin-1 data to UTF-8 before import"],"tags":["serialization","encoding","charset","marshal"],"backgroundTag":"invalid-argument-format","analyzedSha":"88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1","analyzedAt":"2026-09-10T07:29:22.284Z","contentChangedAt":"2026-09-10T07:29:22.284Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}