diff --git a/serde-generate/runtime/dart/serde/binary_deserializer.dart b/serde-generate/runtime/dart/serde/binary_deserializer.dart index 44eeee4cc..661140272 100644 --- a/serde-generate/runtime/dart/serde/binary_deserializer.dart +++ b/serde-generate/runtime/dart/serde/binary_deserializer.dart @@ -79,9 +79,9 @@ abstract class BinaryDeserializer { } int deserializeInt64() { - final result = input.getInt64(_offset, Endian.little); + final number = _bytesToBigInt(8, signed: true); _offset += 8; - return result; + return number.toInt(); } double deserializeFloat32() { diff --git a/serde-generate/runtime/dart/serde/binary_serializer.dart b/serde-generate/runtime/dart/serde/binary_serializer.dart index 0d2d5b89b..899c49063 100644 --- a/serde-generate/runtime/dart/serde/binary_serializer.dart +++ b/serde-generate/runtime/dart/serde/binary_serializer.dart @@ -101,7 +101,13 @@ abstract class BinarySerializer { } void serializeInt64(int value) { - final bdata = ByteData(8)..setInt64(0, value, Endian.little); + BigInt number = BigInt.from(value); + final byteMask = BigInt.from(0xFF); + var bdata = Uint8List(8); + for (int i = 0; i < 8; i++) { + bdata[i] = (number & byteMask).toInt(); + number = number >> 8; + } output.addAll(bdata.buffer.asUint8List()); } diff --git a/serde-generate/runtime/dart/test/bincode_test.dart b/serde-generate/runtime/dart/test/bincode_test.dart index 0ee29da2f..8f932afa7 100644 --- a/serde-generate/runtime/dart/test/bincode_test.dart +++ b/serde-generate/runtime/dart/test/bincode_test.dart @@ -95,6 +95,52 @@ void main() { expect(() => serializer.serializeInt32(-2147483649), throwsException); }); + test('serializeInt64', () { + final serializer = BincodeSerializer(); + serializer.serializeInt64(1); + expect(serializer.bytes, + Uint8List.fromList([1, 0, 0, 0, 0, 0, 0, 0])); + final deserializer = BincodeDeserializer(serializer.bytes); + expect(deserializer.deserializeInt64(), 1); + }); + + test('serializeInt64 negative', () { + final serializer = BincodeSerializer(); + serializer.serializeInt64(-1); + expect(serializer.bytes, + Uint8List.fromList([0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF])); + final deserializer = BincodeDeserializer(serializer.bytes); + expect(deserializer.deserializeInt64(), -1); + }); + + test('serializeInt64 max safe integer', () { + // 2^53 - 1 (JS MAX_SAFE_INTEGER) — largest value portable across all platforms + final serializer = BincodeSerializer(); + serializer.serializeInt64(9007199254740991); + expect(serializer.bytes, + Uint8List.fromList([0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x00])); + final deserializer = BincodeDeserializer(serializer.bytes); + expect(deserializer.deserializeInt64(), 9007199254740991); + }); + + test('serializeInt64 min safe integer', () { + // -(2^53 - 1) (JS MIN_SAFE_INTEGER) + final serializer = BincodeSerializer(); + serializer.serializeInt64(-9007199254740991); + expect(serializer.bytes, + Uint8List.fromList([0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF])); + final deserializer = BincodeDeserializer(serializer.bytes); + expect(deserializer.deserializeInt64(), -9007199254740991); + }); + + test('serializeInt64 typical timestamp', () { + // A realistic epoch-millis value (2026-03-23T00:00:00Z) + final serializer = BincodeSerializer(); + serializer.serializeInt64(1774243200000); + final deserializer = BincodeDeserializer(serializer.bytes); + expect(deserializer.deserializeInt64(), 1774243200000); + }); + test('serializeString', () { final serializer = BincodeSerializer(); serializer.serializeString('dummy text / ダミーテキスト');