Deserializing event-scripts with Kindling

In Ignition 8.1, how can I deserialize event-scripts? I tried to take the data.bin file and gunzip it. After I loaded the gunzipped file into Kindling, I get the following error. Any advice?

Invalid STREAM_MAGIC 0x-26583, should be 0xAC ED
java.lang.IllegalArgumentException: Invalid STREAM_MAGIC 0x-26583, should be 0xAC ED

1 Like

After gunzipping you get Java serialized data...but encoded in a special proprietary format.

It's going to be close to impossible to read that outside of a Java context - I could add it to Kindling as a best effort kind of thing - it won't be perfect because technically modules can extend that deserialization handling, but it should be possible for platform and base Vision stuff.

You ultimately need to invoke deserializeBinary on this class, if you're curious/motivated enough to try to extend Kindling to do it, where some base Ignition dependencies are already in scope.

I tried using the deserializeBinary method and built a .jar executable to take a file as input and to write out the deserialized result. I’m getting runtime errors that seem like the deserializer doesn’t recognize the binary data. Any ideas what I may be doing wrong? Is this for sure the correct method I should be using?

package io.ia.deserializer;

import java.io.IOException;
import java.nio.file.Files;
import java.util.Map;
import com.inductiveautomation.ignition.common.xmlserialization.SerializationException;
import com.inductiveautomation.ignition.common.xmlserialization.deserialization.DeserializationContext;
import com.inductiveautomation.ignition.common.xmlserialization.deserialization.XMLDeserializer;

import static java.nio.file.Files.readAllBytes;

public final class IgnitionDeserializer {

    public static void main (String [] args) {
        if (args.length < 2) {
            System.err.println("Usage: java IgnitionDeserializer <input.bin> <output.txt>");
            System.exit(1);
        }

        // Read serialized input
        byte[] data = null;
        try {
            data = Files.readAllBytes(java.nio.file.Path.of(args[0]));
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

        // Run dumper
        String output = deserialize(data);

        // Write to file
        try {
            Files.writeString(java.nio.file.Path.of(args[1]), output);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

        System.out.println("Deserialized written to " + args[1]);

    }

    private static String deserialize(byte [] data){
        XMLDeserializer xmlDeserializer = new XMLDeserializer();
        DeserializationContext deserializationContext;
        try {
            deserializationContext = xmlDeserializer.deserializeBinary(data);
        } catch (SerializationException e) {
            throw new RuntimeException(e);
        }

        Map<String,String> deserializedMap = deserializationContext.getRootAttributes();
        return deserializedMap.toString();
    }
}

PS C:\Users\akiva\source\repos\ignition-sdk-examples\project-resource> java -jar .\build\libs\project-resource-0.0.1-all.jar "C:\Users\akiva\Downloads\EventScriptBinaries\start_update_shutdown.bin" ./data.out
14:03:43.834 [main] DEBUG Serialization.BinaryParser - Read header, version=2, timestamp=Fri Sep 26 10:00:29 EDT 2025
14:03:43.849 [main] DEBUG Common.BundleUtil - BundleGroupClassLoader#getResource("common.properties")
14:03:43.859 [main] DEBUG Common.BundleUtil - BundleGroupClassLoader#getResource("common_en.properties")
14:03:43.860 [main] DEBUG Common.BundleUtil - BundleGroupClassLoader#getResource("common_en_US.properties")
14:03:43.860 [main] DEBUG Common.BundleUtil - Requested load of resource bundle 'common' for locale 'en_US', received bundle for ''
14:03:43.862 [main] DEBUG Serialization.BinaryParser - Read 32 strings from string-table in 3 ms.
Exception in thread "main" java.lang.RuntimeException: com.inductiveautomation.ignition.common.xmlserialization.SerializationException: Unexpected parsing error during binary deserialization.
        at io.ia.deserializer.IgnitionDeserializer.deserialize(IgnitionDeserializer.java:48)
        at io.ia.deserializer.IgnitionDeserializer.main(IgnitionDeserializer.java:29)
Caused by: com.inductiveautomation.ignition.common.xmlserialization.SerializationException: Unexpected parsing error during binary deserialization.
        at com.inductiveautomation.ignition.common.xmlserialization.deserialization.XMLDeserializer.deserializeBinary(XMLDeserializer.java:376)
        at com.inductiveautomation.ignition.common.xmlserialization.deserialization.XMLDeserializer.deserializeBinary(XMLDeserializer.java:355)
        at io.ia.deserializer.IgnitionDeserializer.deserialize(IgnitionDeserializer.java:46)
        ... 1 more
Caused by: org.apache.commons.io.IOExceptionWithCause: java.lang.ClassNotFoundException: str
        at com.inductiveautomation.ignition.common.xmlserialization.encoding.Decoders$SignatureDecoder.binaryToObject(Decoders.java:434)
        at com.inductiveautomation.ignition.common.xmlserialization.encoding.Decoders$SignatureDecoder.binaryToObject(Decoders.java:408)
        at com.inductiveautomation.ignition.common.xmlserialization.deserialization.BinaryParser.readAttributes(BinaryParser.java:179)
        at com.inductiveautomation.ignition.common.xmlserialization.deserialization.BinaryParser.readElement(BinaryParser.java:148)
        at com.inductiveautomation.ignition.common.xmlserialization.deserialization.BinaryParser.readElement(BinaryParser.java:157)
        at com.inductiveautomation.ignition.common.xmlserialization.deserialization.BinaryParser.readElement(BinaryParser.java:157)
        at com.inductiveautomation.ignition.common.xmlserialization.deserialization.BinaryParser.parse(BinaryParser.java:51)
        at com.inductiveautomation.ignition.common.xmlserialization.deserialization.XMLDeserializer.deserializeBinary(XMLDeserializer.java:367)
        ... 3 more
Caused by: java.lang.ClassNotFoundException: str
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:580)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:490)
        at java.base/java.lang.Class.forName0(Native Method)
        at java.base/java.lang.Class.forName(Class.java:467)
        at java.base/java.lang.Class.forName(Class.java:458)
        at com.inductiveautomation.ignition.common.xmlserialization.ClassNameResolver.classForNameImpl(ClassNameResolver.java:196)
        at com.inductiveautomation.ignition.common.xmlserialization.ClassNameResolver.classForName(ClassNameResolver.java:169)
        at com.inductiveautomation.ignition.common.xmlserialization.encoding.Decoders$SignatureDecoder.binaryToObject(Decoders.java:430)
        ... 10 more

You'll need to at least call initDefaults() on your deserializer instance:

Feel free to try this PR out:

It's probably not immediately useful to you, but should prove the concept:

1 Like