Skip to content

Commit 1b08d64

Browse files
committed
[Java]: Corrected serialization of IR to use schema defined character encoding.
1 parent d96fa2d commit 1b08d64

File tree

2 files changed

+19
-22
lines changed

2 files changed

+19
-22
lines changed

main/java/uk/co/real_logic/sbe/ir/Deserializer.java

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -78,10 +78,7 @@ public IntermediateRepresentation deserialize()
7878
final List<Token> tokens = new ArrayList<>();
7979
while (offset < size)
8080
{
81-
final Token token = deserializeToken();
82-
83-
// System.out.println(token.toString());
84-
tokens.add(token);
81+
tokens.add(deserializeToken());
8582
}
8683

8784
int i = 0, size = tokens.size();
@@ -146,7 +143,7 @@ private void deserializeFrame()
146143

147144
if (serializedFrame.sbeIrVersion() != 0)
148145
{
149-
// TODO: throw exception since we don't know how to handle this
146+
throw new IllegalStateException("Unknown SBE version: " + serializedFrame.sbeIrVersion());
150147
}
151148

152149
final byte[] byteArray = new byte[1024];
@@ -159,38 +156,38 @@ private void deserializeFrame()
159156
}
160157

161158
private Token deserializeToken()
159+
throws UnsupportedEncodingException
162160
{
163-
final Token.Builder builder = new Token.Builder();
161+
final Token.Builder tokenBuilder = new Token.Builder();
164162
final Encoding.Builder encBuilder = new Encoding.Builder();
165163

166164
final byte[] byteArray = new byte[1024];
167165

168166
serializedToken.wrapForDecode(directBuffer, offset, serializedToken.blockLength(), 0);
169167

170-
builder.offset(serializedToken.tokenOffset())
171-
.size(serializedToken.tokenSize())
172-
.schemaId(serializedToken.schemaID())
173-
.version(serializedToken.tokenVersion())
174-
.signal(SerializationUtils.signal(serializedToken.signal()));
168+
tokenBuilder.offset(serializedToken.tokenOffset())
169+
.size(serializedToken.tokenSize())
170+
.schemaId(serializedToken.schemaID())
171+
.version(serializedToken.tokenVersion())
172+
.signal(SerializationUtils.signal(serializedToken.signal()));
175173

176174
final PrimitiveType type = SerializationUtils.primitiveType(serializedToken.primitiveType());
177175

178176
encBuilder.primitiveType(type)
179177
.byteOrder(SerializationUtils.byteOrder(serializedToken.byteOrder()));
180178

181-
// must deserialize vardata in order
182-
183-
builder.name(new String(byteArray, 0, serializedToken.getName(byteArray, 0, byteArray.length)));
179+
tokenBuilder.name(new String(byteArray, 0, serializedToken.getName(byteArray, 0, byteArray.length)));
184180

185181
encBuilder.constVal(SerializationUtils.getVal(valBuffer, type, serializedToken.getConstVal(valArray, 0, valArray.length)));
186182
encBuilder.minVal(SerializationUtils.getVal(valBuffer, type, serializedToken.getMinVal(valArray, 0, valArray.length)));
187183
encBuilder.maxVal(SerializationUtils.getVal(valBuffer, type, serializedToken.getMaxVal(valArray, 0, valArray.length)));
188184
encBuilder.nullVal(SerializationUtils.getVal(valBuffer, type, serializedToken.getNullVal(valArray, 0, valArray.length)));
189185

190-
encBuilder.characterEncoding(new String(byteArray, 0, serializedToken.getCharacterEncoding(byteArray, 0, byteArray.length)));
186+
final int charEncodingSize = serializedToken.getCharacterEncoding(byteArray, 0, byteArray.length);
187+
encBuilder.characterEncoding(new String(byteArray, 0, charEncodingSize, SerializedToken.characterEncodingCharacterEncoding()));
191188

192189
offset += serializedToken.size();
193190

194-
return builder.encoding(encBuilder.build()).build();
191+
return tokenBuilder.encoding(encBuilder.build()).build();
195192
}
196193
}

main/java/uk/co/real_logic/sbe/ir/Serializer.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,7 @@
2121
import uk.co.real_logic.sbe.ir.generated.SerializedToken;
2222
import uk.co.real_logic.sbe.util.Verify;
2323

24-
import java.io.Closeable;
25-
import java.io.FileNotFoundException;
26-
import java.io.FileOutputStream;
27-
import java.io.IOException;
24+
import java.io.*;
2825
import java.nio.ByteBuffer;
2926
import java.nio.channels.FileChannel;
3027
import java.util.List;
@@ -128,6 +125,7 @@ private int serializeFrame()
128125
}
129126

130127
private int serializeToken(final Token token)
128+
throws UnsupportedEncodingException
131129
{
132130
final PrimitiveType type = token.encoding().primitiveType();
133131

@@ -147,8 +145,10 @@ private int serializeToken(final Token token)
147145
serializedToken.putMaxVal(valArray, 0, SerializationUtils.putVal(valBuffer, token.encoding().maxVal(), type));
148146
serializedToken.putNullVal(valArray, 0, SerializationUtils.putVal(valBuffer, token.encoding().nullVal(), type));
149147

150-
serializedToken.putCharacterEncoding(token.encoding().characterEncoding().getBytes(), 0,
151-
token.encoding().characterEncoding().getBytes().length);
148+
final String charEncodingCharEncoding = SerializedToken.characterEncodingCharacterEncoding();
149+
final String charEncoding = token.encoding().characterEncoding();
150+
final byte[] charBytes = charEncoding.getBytes(charEncodingCharEncoding);
151+
serializedToken.putCharacterEncoding(charBytes, 0, charBytes.length);
152152

153153
return serializedToken.size();
154154
}

0 commit comments

Comments
 (0)