Skip to content
Snippets Groups Projects
Commit f5aad82f authored by Janne Mareike Koschinski's avatar Janne Mareike Koschinski
Browse files

Attempt to fix encoder issues

parent d6331244
No related branches found
No related tags found
No related merge requests found
...@@ -11,21 +11,15 @@ import java.nio.charset.CharsetEncoder ...@@ -11,21 +11,15 @@ import java.nio.charset.CharsetEncoder
import kotlin.concurrent.getOrSet import kotlin.concurrent.getOrSet
abstract class StringSerializer( abstract class StringSerializer(
private val encoder: CharsetEncoder, private val charset: Charset,
private val decoder: CharsetDecoder,
private val trailingNullBytes: Int private val trailingNullBytes: Int
) : Serializer<String?> { ) : Serializer<String?> {
constructor(charset: Charset, trailingNullByte: Boolean = false) : this( constructor(charset: Charset, trailingNullByte: Boolean = false) :
charset.newEncoder(), this(charset, if (trailingNullByte) 1 else 0)
charset.newDecoder(),
if (trailingNullByte) {
1
} else {
0
}
)
private val charBuffer = ThreadLocal<CharBuffer>() private val charBuffer = ThreadLocal<CharBuffer>()
private val encoder = ThreadLocal<CharsetEncoder>()
private val decoder = ThreadLocal<CharsetDecoder>()
object UTF16 : StringSerializer(Charsets.UTF_16BE) object UTF16 : StringSerializer(Charsets.UTF_16BE)
object UTF8 : StringSerializer(Charsets.UTF_8) object UTF8 : StringSerializer(Charsets.UTF_8)
...@@ -45,6 +39,9 @@ abstract class StringSerializer( ...@@ -45,6 +39,9 @@ abstract class StringSerializer(
return buf return buf
} }
private inline fun encoder() = encoder.getOrSet(charset::newEncoder)
private inline fun decoder() = decoder.getOrSet(charset::newDecoder)
override fun serialize(buffer: ChainedByteBuffer, data: String?, features: QuasselFeatures) = override fun serialize(buffer: ChainedByteBuffer, data: String?, features: QuasselFeatures) =
try { try {
if (data == null) { if (data == null) {
...@@ -53,6 +50,7 @@ abstract class StringSerializer( ...@@ -53,6 +50,7 @@ abstract class StringSerializer(
val charBuffer = charBuffer(data.length) val charBuffer = charBuffer(data.length)
charBuffer.put(data) charBuffer.put(data)
charBuffer.flip() charBuffer.flip()
val encoder = encoder()
encoder.reset() encoder.reset()
val byteBuffer = encoder.encode(charBuffer) val byteBuffer = encoder.encode(charBuffer)
IntSerializer.serialize(buffer, byteBuffer.remaining() + trailingNullBytes, features) IntSerializer.serialize(buffer, byteBuffer.remaining() + trailingNullBytes, features)
...@@ -71,6 +69,7 @@ abstract class StringSerializer( ...@@ -71,6 +69,7 @@ abstract class StringSerializer(
val charBuffer = charBuffer(data.length) val charBuffer = charBuffer(data.length)
charBuffer.put(data) charBuffer.put(data)
charBuffer.flip() charBuffer.flip()
val encoder = encoder()
encoder.reset() encoder.reset()
encoder.encode(charBuffer) encoder.encode(charBuffer)
} }
...@@ -86,6 +85,7 @@ abstract class StringSerializer( ...@@ -86,6 +85,7 @@ abstract class StringSerializer(
val limit = buffer.limit() val limit = buffer.limit()
buffer.limit(buffer.position() + len - trailingNullBytes) buffer.limit(buffer.position() + len - trailingNullBytes)
val charBuffer = charBuffer(len) val charBuffer = charBuffer(len)
val decoder = decoder()
decoder.reset() decoder.reset()
decoder.decode(buffer, charBuffer, true) decoder.decode(buffer, charBuffer, true)
buffer.limit(limit) buffer.limit(limit)
...@@ -106,6 +106,7 @@ abstract class StringSerializer( ...@@ -106,6 +106,7 @@ abstract class StringSerializer(
val limit = buffer.limit() val limit = buffer.limit()
buffer.limit(buffer.position() + Math.max(0, len - trailingNullBytes)) buffer.limit(buffer.position() + Math.max(0, len - trailingNullBytes))
val charBuffer = charBuffer(len) val charBuffer = charBuffer(len)
val decoder = decoder()
decoder.decode(buffer, charBuffer, true) decoder.decode(buffer, charBuffer, true)
buffer.limit(limit) buffer.limit(limit)
buffer.position(buffer.position() + trailingNullBytes) buffer.position(buffer.position() + trailingNullBytes)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment