13
13
14
14
import zserio .runtime .ZserioEnum ;
15
15
import zserio .runtime .ZserioError ;
16
+ import zserio .runtime .ZserioSubtype ;
16
17
17
18
/**
18
19
* Provides help methods for serialization and deserialization of generated objects.
@@ -71,7 +72,7 @@ public static <T extends Writer> BitBuffer serialize(T object)
71
72
*
72
73
* @return Generated object created from given bit buffer.
73
74
*/
74
- public static <T > T deserialize (final Class <T > clazz , BitBuffer bitBuffer , Object ... arguments )
75
+ public static <T > T deserialize (Class <T > clazz , BitBuffer bitBuffer , Object ... arguments )
75
76
{
76
77
return deserializeFromBytes (clazz , bitBuffer .getBuffer (), arguments );
77
78
}
@@ -136,7 +137,7 @@ public static <T extends Writer> byte[] serializeToBytes(T object)
136
137
*
137
138
* @return Generated object created from given byte array.
138
139
*/
139
- public static <T > T deserializeFromBytes (final Class <T > clazz , byte [] buffer , Object ... arguments )
140
+ public static <T > T deserializeFromBytes (Class <T > clazz , byte [] buffer , Object ... arguments )
140
141
{
141
142
try (final BitStreamReader reader = new ByteArrayBitStreamReader (buffer ))
142
143
{
@@ -148,6 +149,42 @@ public static <T> T deserializeFromBytes(final Class<T> clazz, byte[] buffer, Ob
148
149
}
149
150
}
150
151
152
+ /**
153
+ * Deserializes byte array to the generated object given by the class name.
154
+ * <p>
155
+ * This method resolves subtypes to the base types before deserialization.
156
+ * <p>
157
+ * This method can potentially use all bits of the last byte even if not all of them were written during
158
+ * serialization (because there is no way how to specify exact number of bits). Thus, it could allow reading
159
+ * behind stream (possibly in case of damaged data).
160
+ * <p>
161
+ * Example:
162
+ * <blockquote><pre>
163
+ * import zserio.runtime.io.SerializeUtil;
164
+ *
165
+ * final SomeZserioObject object = new SomeZserioObject();
166
+ * final byte[] buffer = SerializeUtil.serializeToBytes(object);
167
+ * final SomeZserioObject readObject = SerializeUtil.deserializeFromBytes("SomeZserioObject", buffer);
168
+ * </pre></blockquote>
169
+ *
170
+ * @param className Class name of the generated object to deserialize.
171
+ * @param buffer Byte array which represents generated object in binary format.
172
+ * @param arguments Additional arguments needed for reader constructor (optional).
173
+ *
174
+ * @return Generated object created from given byte array.
175
+ */
176
+ public static Object deserializeFromBytes (String className , byte [] buffer , Object ... arguments )
177
+ {
178
+ try (final BitStreamReader reader = new ByteArrayBitStreamReader (buffer ))
179
+ {
180
+ return deserializeFromReader (className , reader , arguments );
181
+ }
182
+ catch (IOException exception )
183
+ {
184
+ throw new ZserioError ("SerializeUtil: " + exception , exception );
185
+ }
186
+ }
187
+
151
188
/**
152
189
* Serializes generated object to the file using file name.
153
190
* <p>
@@ -231,11 +268,39 @@ public static <T extends Writer> void serializeToFile(T object, File file)
231
268
*
232
269
* @return Generated object created from given file contents.
233
270
*/
234
- public static <T > T deserializeFromFile (final Class <T > clazz , String fileName , Object ... arguments )
271
+ public static <T > T deserializeFromFile (Class <T > clazz , String fileName , Object ... arguments )
235
272
{
236
273
return deserializeFromFile (clazz , new File (fileName ), arguments );
237
274
}
238
275
276
+ /**
277
+ * Deserializes file to the generated object using class name and file name.
278
+ * <p>
279
+ * This method resolves subtypes to the base types before deserialization.
280
+ * <p>
281
+ * This is a convenient method for users to easily read given generated object from file.
282
+ * <p>
283
+ * Example:
284
+ * <blockquote><pre>
285
+ * import zserio.runtime.io.SerializeUtil;
286
+ *
287
+ * final String fileName = "FileName.bin";
288
+ * final SomeZserioObject object = new SomeZserioObject();
289
+ * SerializeUtil.serializeToFile(object, fileName);
290
+ * final SomeZserioObject readObject = SerializeUtil.deserializeFromFile("SomeZserioObject", fileName);
291
+ * </pre></blockquote>
292
+ *
293
+ * @param className Class name of the generated object to deserialize.
294
+ * @param fileName Name of the file which represents generated object in binary format.
295
+ * @param arguments Additional arguments needed for reader constructor (optional).
296
+ *
297
+ * @return Generated object created from given file contents.
298
+ */
299
+ public static Object deserializeFromFile (String className , String fileName , Object ... arguments )
300
+ {
301
+ return deserializeFromFile (className , new File (fileName ), arguments );
302
+ }
303
+
239
304
/**
240
305
* Deserializes file to the generated object.
241
306
* <p>
@@ -258,7 +323,7 @@ public static <T> T deserializeFromFile(final Class<T> clazz, String fileName, O
258
323
*
259
324
* @return Generated object created from given file contents.
260
325
*/
261
- public static <T > T deserializeFromFile (final Class <T > clazz , File file , Object ... arguments )
326
+ public static <T > T deserializeFromFile (Class <T > clazz , File file , Object ... arguments )
262
327
{
263
328
try
264
329
{
@@ -274,15 +339,73 @@ public static <T> T deserializeFromFile(final Class<T> clazz, File file, Object.
274
339
}
275
340
}
276
341
342
+ /**
343
+ * Deserializes file to the generated object using class name.
344
+ * <p>
345
+ * This method resolves subtypes to the base types before deserialization.
346
+ * <p>
347
+ * This is a convenient method for users to easily read given generated object from file.
348
+ * <p>
349
+ * Example:
350
+ * <blockquote><pre>
351
+ * import zserio.runtime.io.SerializeUtil;
352
+ *
353
+ * final String fileName = "FileName.bin";
354
+ * final SomeZserioObject object = new SomeZserioObject();
355
+ * SerializeUtil.serializeToFile(object, fileName);
356
+ * final SomeZserioObject readObject = SerializeUtil.deserializeFromFile("SomeZserioObject", fileName);
357
+ * </pre></blockquote>
358
+ *
359
+ * @param className Class name of the generated object to deserialize.
360
+ * @param file File which represents generated object in binary format.
361
+ * @param arguments Additional arguments needed for reader constructor (optional).
362
+ *
363
+ * @return Generated object created from given file contents.
364
+ */
365
+ public static Object deserializeFromFile (String className , File file , Object ... arguments )
366
+ {
367
+ try
368
+ {
369
+ final byte [] fileContent = Files .readAllBytes (file .toPath ());
370
+ try (final BitStreamReader reader = new ByteArrayBitStreamReader (fileContent ))
371
+ {
372
+ return deserializeFromReader (className , reader , arguments );
373
+ }
374
+ }
375
+ catch (IOException exception )
376
+ {
377
+ throw new ZserioError ("SerializeUtil: " + exception , exception );
378
+ }
379
+ }
380
+
277
381
private static <T extends Writer > void serializeToWriter (T object , BitStreamWriter writer )
278
382
throws IOException
279
383
{
280
384
object .initializeOffsets (writer .getBitPosition ());
281
385
object .write (writer );
282
386
}
283
387
284
- private static <T > T deserializeFromReader (
285
- final Class <T > clazz , BitStreamReader reader , Object ... arguments )
388
+ private static Object deserializeFromReader (String className , BitStreamReader reader , Object ... arguments )
389
+ {
390
+ try
391
+ {
392
+ Class <?> clazz = Class .forName (className );
393
+ if (clazz .isInstance (ZserioSubtype .class ))
394
+ {
395
+ final Method baseClassMethod = clazz .getMethod ("getBaseClass" );
396
+ clazz = (Class <?>)baseClassMethod .invoke (null );
397
+ }
398
+
399
+ return deserializeFromReader (clazz , reader , arguments );
400
+ }
401
+ catch (ClassNotFoundException | NoSuchMethodException | SecurityException | IllegalAccessException |
402
+ IllegalArgumentException | InvocationTargetException exception )
403
+ {
404
+ throw new ZserioError ("SerializeUtil: " + exception , exception );
405
+ }
406
+ }
407
+
408
+ private static <T > T deserializeFromReader (Class <T > clazz , BitStreamReader reader , Object ... arguments )
286
409
{
287
410
try
288
411
{
0 commit comments