{"record":{"id":"e772f0442dafd4ee","repo":"dotnet/aspnetcore","slug":"error-writing-messagepack-data","errorCode":null,"errorMessage":"Error writing MessagePack data.","messagePattern":"Error writing MessagePack data\\.","errorType":"exception","errorClass":"RuntimeException","httpStatus":null,"severity":"error","filePath":"src/SignalR/clients/java/signalr/messagepack/src/main/java/com/microsoft/signalr/messagepack/MessagePackHubProtocol.java","lineNumber":189,"sourceCode":"                default:\n                    throw new RuntimeException(String.format(\"Unexpected message type: %d\", messageType.value));\n            }\n            int length = message.length;\n            List<Byte> header = Utils.getLengthHeader(length);\n            byte[] messageWithHeader = new byte[header.size() + length];\n            int headerSize = header.size();\n\n            // Write the length header, then all of the bytes of the original message\n            for (int i = 0; i < headerSize; i++) {\n                messageWithHeader[i] = header.get(i);\n            }\n            for (int i = 0; i < length; i++) {\n                messageWithHeader[i + headerSize] = message[i];\n            }\n\n            return ByteBuffer.wrap(messageWithHeader);\n        } catch (MessagePackException | IOException ex) {\n            throw new RuntimeException(\"Error writing MessagePack data.\", ex);\n        }\n    }\n\n    private HubMessage createInvocationMessage(MessageUnpacker unpacker, InvocationBinder binder, int itemCount, ByteBuffer payload) throws IOException {\n        Map<String, String> headers = readHeaders(unpacker);\n\n        // invocationId may be nil\n        String invocationId = null;\n        if (!unpacker.tryUnpackNil()) {\n            invocationId = unpacker.unpackString();\n        }\n\n        // For MsgPack, we represent an empty invocation ID as an empty string,\n        // so we need to normalize that to \"null\", which is what indicates a non-blocking invocation.\n        if (invocationId == null || invocationId.isEmpty()) {\n            invocationId = null;\n        }\n","sourceCodeStart":171,"sourceCodeEnd":207,"githubUrl":"https://github.com/dotnet/aspnetcore/blob/294cab2f9b2e03af6b953820c7ab497c3c8b7ad9/src/SignalR/clients/java/signalr/messagepack/src/main/java/com/microsoft/signalr/messagepack/MessagePackHubProtocol.java#L171-L207","documentation":"Wraps MessagePackException/IOException thrown while serializing an outbound message through the Jackson MessagePack ObjectMapper/packer. It is usually caused by an argument type Jackson cannot serialize — no default constructor, circular references, an unsupported type like raw ByteBuffer, or a missing date/time module.","triggerScenarios":"Passing an object to hubConnection.invoke/send that the MessagePack ObjectMapper cannot serialize; sending IO/framework types or POJOs without accessible constructors/getters.","commonSituations":"Sending a Java object lacking a no-arg constructor or getters; including unserializable fields (ByteBuffer, InputStream, lambdas); sending java.time types without jackson-datatype-jsr310 registered.","solutions":["Ensure arguments sent to hub methods are plain POJOs serializable by Jackson.","Register jackson-datatype-jsr310 (and any other needed modules) if sending date/time types.","Map framework/IO types to simple DTOs (e.g. byte[] instead of ByteBuffer) before sending."],"exampleFix":"// before\nhubConnection.send(\"Upload\", someByteBuffer);\n\n// after\nhubConnection.send(\"Upload\", someByteBuffer.array());","handlingStrategy":"validation","validationCode":"// Java - only send Jackson-serializable POJOs\nstatic boolean isLikelySerializable(Object o) {\n    return o == null\n        || o instanceof String || o instanceof Number || o instanceof Boolean\n        || o instanceof java.util.Collection || o instanceof java.util.Map\n        || (o.getClass().isArray() && !o.getClass().getComponentType().getName().contains(\"Buffer\"));\n}","typeGuard":null,"tryCatchPattern":"// Java\ntry {\n    hubConnection.send(\"Method\", arg).blockingAwait();\n} catch (RuntimeException ex) {\n    if (ex.getMessage() != null && ex.getMessage().contains(\"writing MessagePack\")) {\n        // replace unserializable arg (ByteBuffer, IO type, etc.) with a plain DTO\n    }\n}","preventionTips":["Send only plain POJOs that Jackson can serialize (no-arg constructor, accessible fields/getters).","Register jackson-datatype-jsr310 for date/time types.","Convert IO/framework types (ByteBuffer, streams) to byte[] or DTOs before sending."],"tags":["signalr","messagepack","serialization","jackson"],"analyzedSha":"294cab2f9b2e03af6b953820c7ab497c3c8b7ad9","analyzedAt":"2026-08-06T20:08:02.189Z","schemaVersion":2},"datasetVersion":"2026-08-06T23:17:07.152Z"}