You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by sr...@apache.org on 2021/07/02 08:00:56 UTC

[plc4x] branch develop updated: plc4j: added a Serializable interface

This is an automated email from the ASF dual-hosted git repository.

sruehl pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git


The following commit(s) were added to refs/heads/develop by this push:
     new b17673a  plc4j: added a Serializable interface
b17673a is described below

commit b17673a0cc5cd7cc12d813257ef40149b5b15c72
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Fri Jul 2 10:00:00 2021 +0200

    plc4j: added a Serializable interface
    
    + This should bring the serialization in line with the generated code so the SPI objects can be printed in whatever form required
---
 .../plc4x/java/ads/field/DirectAdsField.java       | 16 +++++
 .../plc4x/java/ads/field/DirectAdsStringField.java | 16 +++++
 .../plc4x/java/ads/field/SymbolicAdsField.java     | 17 +++++
 .../java/ads/field/SymbolicAdsStringField.java     | 35 +++++++----
 .../java/canopen/field/CANOpenHeartbeatField.java  | 14 +++++
 .../plc4x/java/canopen/field/CANOpenNMTField.java  | 15 +++++
 .../plc4x/java/canopen/field/CANOpenPDOField.java  | 16 +++++
 .../plc4x/java/canopen/field/CANOpenSDOField.java  | 16 +++++
 .../plc4x/java/eip/readwrite/field/EipField.java   | 54 ++++++++++------
 .../apache/plc4x/java/mock/field/MockPlcValue.java |  7 +++
 .../plc4x/java/modbus/field/ModbusField.java       | 27 ++++++--
 .../plc4x/java/s7/readwrite/field/S7Field.java     | 72 ++++++++++++++--------
 .../java/s7/readwrite/field/S7StringField.java     | 33 ++++++++--
 .../java/spi/messages/DefaultPlcReadRequest.java   | 23 +++++++
 .../java/spi/messages/DefaultPlcReadResponse.java  | 22 +++++++
 .../messages/DefaultPlcSubscriptionRequest.java    | 25 ++++++++
 .../messages/DefaultPlcSubscriptionResponse.java   | 24 ++++++++
 .../messages/DefaultPlcUnsubscriptionRequest.java  | 14 +++--
 .../messages/DefaultPlcUnsubscriptionResponse.java |  7 +++
 .../java/spi/messages/DefaultPlcWriteRequest.java  | 42 ++++++++++++-
 .../java/spi/messages/DefaultPlcWriteResponse.java | 23 +++++++
 .../java/spi/messages/utils/ResponseItem.java      | 21 ++++++-
 .../{XmlSerializable.java => Serializable.java}    |  9 ++-
 .../plc4x/java/spi/utils/XmlSerializable.java      |  7 ++-
 .../plc4x/java/spi/values/PlcBigDecimal.java       |  7 +++
 .../plc4x/java/spi/values/PlcBigInteger.java       |  7 +++
 .../org/apache/plc4x/java/spi/values/PlcDATE.java  |  7 +++
 .../plc4x/java/spi/values/PlcDATE_AND_TIME.java    |  7 +++
 .../apache/plc4x/java/spi/values/PlcIECValue.java  | 10 +++
 .../org/apache/plc4x/java/spi/values/PlcLTIME.java |  7 +++
 .../org/apache/plc4x/java/spi/values/PlcList.java  | 15 +++++
 .../apache/plc4x/java/spi/values/PlcSTRING.java    |  7 +++
 .../apache/plc4x/java/spi/values/PlcStruct.java    | 19 ++++++
 .../org/apache/plc4x/java/spi/values/PlcTIME.java  |  7 +++
 .../plc4x/java/spi/values/PlcTIME_OF_DAY.java      |  7 +++
 35 files changed, 573 insertions(+), 82 deletions(-)

diff --git a/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/field/DirectAdsField.java b/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/field/DirectAdsField.java
index f352a68..c084f92 100644
--- a/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/field/DirectAdsField.java
+++ b/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/field/DirectAdsField.java
@@ -20,9 +20,12 @@ package org.apache.plc4x.java.ads.field;
 
 import org.apache.plc4x.java.ads.readwrite.types.AdsDataType;
 import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 
+import java.nio.charset.StandardCharsets;
 import java.util.Objects;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -148,6 +151,19 @@ public class DirectAdsField implements AdsField {
     }
 
     @Override
+    public void serialize(WriteBuffer writeBuffer) throws ParseException {
+        writeBuffer.pushContext(getClass().getSimpleName());
+
+        writeBuffer.writeLong("indexGroup", 64, getIndexGroup());
+        writeBuffer.writeLong("indexOffset", 64, getIndexOffset());
+        writeBuffer.writeLong("numberOfElements", 64, getNumberOfElements());
+        String plcDataType = getPlcDataType();
+        writeBuffer.writeString("dataType", plcDataType.getBytes(StandardCharsets.UTF_8).length * 8, StandardCharsets.UTF_8.name(), plcDataType);
+
+        writeBuffer.popContext(getClass().getSimpleName());
+    }
+
+    @Override
     public void xmlSerialize(Element parent) {
         Document doc = parent.getOwnerDocument();
         Element messageElement = doc.createElement(getClass().getSimpleName());
diff --git a/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/field/DirectAdsStringField.java b/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/field/DirectAdsStringField.java
index bbca100..9d80ca4 100644
--- a/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/field/DirectAdsStringField.java
+++ b/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/field/DirectAdsStringField.java
@@ -20,9 +20,12 @@ package org.apache.plc4x.java.ads.field;
 
 import org.apache.plc4x.java.ads.readwrite.types.AdsDataType;
 import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 
+import java.nio.charset.StandardCharsets;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -102,6 +105,19 @@ public class DirectAdsStringField extends DirectAdsField implements AdsStringFie
     }
 
     @Override
+    public void serialize(WriteBuffer writeBuffer) throws ParseException {
+        writeBuffer.pushContext(getClass().getSimpleName());
+
+        writeBuffer.writeLong("indexGroup", 64, getIndexGroup());
+        writeBuffer.writeLong("indexOffset", 64, getIndexOffset());
+        writeBuffer.writeLong("numberOfElements", 64, getNumberOfElements());
+        String plcDataType = getPlcDataType();
+        writeBuffer.writeString("dataType", plcDataType.getBytes(StandardCharsets.UTF_8).length * 8, StandardCharsets.UTF_8.name(), plcDataType);
+
+        writeBuffer.popContext(getClass().getSimpleName());
+    }
+
+    @Override
     public void xmlSerialize(Element parent) {
         Document doc = parent.getOwnerDocument();
         Element messageElement = doc.createElement(getClass().getSimpleName());
diff --git a/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/field/SymbolicAdsField.java b/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/field/SymbolicAdsField.java
index e973efa..12a4ced 100644
--- a/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/field/SymbolicAdsField.java
+++ b/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/field/SymbolicAdsField.java
@@ -20,9 +20,12 @@ package org.apache.plc4x.java.ads.field;
 
 import org.apache.plc4x.java.ads.readwrite.types.AdsDataType;
 import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 
+import java.nio.charset.StandardCharsets;
 import java.util.Objects;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -114,6 +117,20 @@ public class SymbolicAdsField implements AdsField {
     }
 
     @Override
+    public void serialize(WriteBuffer writeBuffer) throws ParseException {
+        writeBuffer.pushContext(getClass().getSimpleName());
+
+        String symbolicAddress = getSymbolicAddress();
+        writeBuffer.writeString("symbolicAddress", symbolicAddress.getBytes(StandardCharsets.UTF_8).length * 8, StandardCharsets.UTF_8.name(), symbolicAddress);
+
+        writeBuffer.writeInt("numberOfElements", 64, getNumberOfElements());
+
+        String dataType = getPlcDataType();
+        writeBuffer.writeString("dataType", dataType.getBytes(StandardCharsets.UTF_8).length * 8, StandardCharsets.UTF_8.name(), dataType);
+        writeBuffer.popContext(getClass().getSimpleName());
+    }
+
+    @Override
     public void xmlSerialize(Element parent) {
         Document doc = parent.getOwnerDocument();
         Element messageElement = doc.createElement(getClass().getSimpleName());
diff --git a/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/field/SymbolicAdsStringField.java b/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/field/SymbolicAdsStringField.java
index 11530ae..bceacf9 100644
--- a/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/field/SymbolicAdsStringField.java
+++ b/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/field/SymbolicAdsStringField.java
@@ -20,9 +20,12 @@ package org.apache.plc4x.java.ads.field;
 
 import org.apache.plc4x.java.ads.readwrite.types.AdsDataType;
 import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 
+import java.nio.charset.StandardCharsets;
 import java.util.Objects;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -78,21 +81,27 @@ public class SymbolicAdsStringField extends SymbolicAdsField implements AdsStrin
     }
 
     @Override
-    public void xmlSerialize(Element parent) {
-        Document doc = parent.getOwnerDocument();
-        Element messageElement = doc.createElement(getClass().getSimpleName());
-        parent.appendChild(messageElement);
+    public void serialize(WriteBuffer writeBuffer) throws ParseException {
+        writeBuffer.pushContext(getClass().getSimpleName());
+
+        String symbolicAddress = getSymbolicAddress();
+        writeBuffer.writeString("symbolicAddress", symbolicAddress.getBytes(StandardCharsets.UTF_8).length * 8, StandardCharsets.UTF_8.name(), symbolicAddress);
+
+        writeBuffer.writeInt("numberOfElements", 64, getNumberOfElements());
 
-        Element symbolicAddressElement = doc.createElement("symbolicAddress");
-        symbolicAddressElement.appendChild(doc.createTextNode(getSymbolicAddress()));
-        messageElement.appendChild(symbolicAddressElement);
+        String dataType = getPlcDataType();
+        writeBuffer.writeString("dataType", dataType.getBytes(StandardCharsets.UTF_8).length * 8, StandardCharsets.UTF_8.name(), dataType);
 
-        Element numberOfElementsElement = doc.createElement("numberOfElements");
-        numberOfElementsElement.appendChild(doc.createTextNode(Integer.toString(getNumberOfElements())));
-        messageElement.appendChild(numberOfElementsElement);
+        writeBuffer.writeInt("stringLength", 64, getStringLength());
+        writeBuffer.popContext(getClass().getSimpleName());
+    }
 
-        Element datatypeElement = doc.createElement("dataType");
-        datatypeElement.appendChild(doc.createTextNode(getPlcDataType()));
-        messageElement.appendChild(datatypeElement);
+    @Override
+    public void xmlSerialize(Element parent) {
+        super.xmlSerialize(parent);
+        Document doc = parent.getOwnerDocument();
+        Element byteOffsetElement = doc.createElement("stringLength");
+        byteOffsetElement.appendChild(doc.createTextNode(Integer.toString(getStringLength())));
+        parent.getFirstChild().appendChild(byteOffsetElement);
     }
 }
diff --git a/plc4j/drivers/canopen/src/main/java/org/apache/plc4x/java/canopen/field/CANOpenHeartbeatField.java b/plc4j/drivers/canopen/src/main/java/org/apache/plc4x/java/canopen/field/CANOpenHeartbeatField.java
index 9607540..501150f 100644
--- a/plc4j/drivers/canopen/src/main/java/org/apache/plc4x/java/canopen/field/CANOpenHeartbeatField.java
+++ b/plc4j/drivers/canopen/src/main/java/org/apache/plc4x/java/canopen/field/CANOpenHeartbeatField.java
@@ -20,9 +20,12 @@ package org.apache.plc4x.java.canopen.field;
 
 import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
 import org.apache.plc4x.java.canopen.readwrite.types.CANOpenService;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 
+import java.nio.charset.StandardCharsets;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -64,6 +67,17 @@ public class CANOpenHeartbeatField extends CANOpenField implements CANOpenSubscr
     }
 
     @Override
+    public void serialize(WriteBuffer writeBuffer) throws ParseException {
+        writeBuffer.pushContext(getClass().getSimpleName());
+
+        String serviceName = getService().name();
+        writeBuffer.writeString("service", serviceName.getBytes(StandardCharsets.UTF_8).length * 8, StandardCharsets.UTF_8.name(), serviceName);
+        writeBuffer.writeInt("node", 64, getNodeId());
+        
+        writeBuffer.popContext(getClass().getSimpleName());
+    }
+
+    @Override
     public void xmlSerialize(Element parent) {
         Document doc = parent.getOwnerDocument();
         Element messageElement = doc.createElement(getClass().getSimpleName());
diff --git a/plc4j/drivers/canopen/src/main/java/org/apache/plc4x/java/canopen/field/CANOpenNMTField.java b/plc4j/drivers/canopen/src/main/java/org/apache/plc4x/java/canopen/field/CANOpenNMTField.java
index 5f89371..9bff00d 100644
--- a/plc4j/drivers/canopen/src/main/java/org/apache/plc4x/java/canopen/field/CANOpenNMTField.java
+++ b/plc4j/drivers/canopen/src/main/java/org/apache/plc4x/java/canopen/field/CANOpenNMTField.java
@@ -20,9 +20,12 @@ package org.apache.plc4x.java.canopen.field;
 
 import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
 import org.apache.plc4x.java.canopen.readwrite.types.CANOpenService;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 
+import java.nio.charset.StandardCharsets;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -63,6 +66,18 @@ public class CANOpenNMTField extends CANOpenField implements CANOpenSubscription
         return new CANOpenNMTField(nodeId);
     }
 
+
+    @Override
+    public void serialize(WriteBuffer writeBuffer) throws ParseException {
+        writeBuffer.pushContext(getClass().getSimpleName());
+
+        String serviceName = getService().name();
+        writeBuffer.writeString("service", serviceName.getBytes(StandardCharsets.UTF_8).length * 8, StandardCharsets.UTF_8.name(), serviceName);
+        writeBuffer.writeInt("node",64, getNodeId());
+
+        writeBuffer.popContext(getClass().getSimpleName());
+    }
+
     @Override
     public void xmlSerialize(Element parent) {
         Document doc = parent.getOwnerDocument();
diff --git a/plc4j/drivers/canopen/src/main/java/org/apache/plc4x/java/canopen/field/CANOpenPDOField.java b/plc4j/drivers/canopen/src/main/java/org/apache/plc4x/java/canopen/field/CANOpenPDOField.java
index 1c4e7ea..d15d155 100644
--- a/plc4j/drivers/canopen/src/main/java/org/apache/plc4x/java/canopen/field/CANOpenPDOField.java
+++ b/plc4j/drivers/canopen/src/main/java/org/apache/plc4x/java/canopen/field/CANOpenPDOField.java
@@ -21,9 +21,12 @@ package org.apache.plc4x.java.canopen.field;
 import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
 import org.apache.plc4x.java.canopen.readwrite.types.CANOpenDataType;
 import org.apache.plc4x.java.canopen.readwrite.types.CANOpenService;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 
+import java.nio.charset.StandardCharsets;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -82,6 +85,19 @@ public class CANOpenPDOField extends CANOpenField implements CANOpenSubscription
     }
 
     @Override
+    public void serialize(WriteBuffer writeBuffer) throws ParseException {
+        writeBuffer.pushContext(getClass().getSimpleName());
+
+        String serviceName = getService().name();
+        writeBuffer.writeString("service", serviceName.getBytes(StandardCharsets.UTF_8).length * 8, StandardCharsets.UTF_8.name(), serviceName);
+        writeBuffer.writeInt("node",64, getNodeId());
+        String dataTypeName = getCanOpenDataType().name();
+        writeBuffer.writeString("dataType", dataTypeName.getBytes(StandardCharsets.UTF_8).length * 8, StandardCharsets.UTF_8.name(), dataTypeName);
+
+        writeBuffer.popContext(getClass().getSimpleName());
+    }
+
+    @Override
     public void xmlSerialize(Element parent) {
         Document doc = parent.getOwnerDocument();
         Element messageElement = doc.createElement(getClass().getSimpleName());
diff --git a/plc4j/drivers/canopen/src/main/java/org/apache/plc4x/java/canopen/field/CANOpenSDOField.java b/plc4j/drivers/canopen/src/main/java/org/apache/plc4x/java/canopen/field/CANOpenSDOField.java
index c4a51d4..8745977 100644
--- a/plc4j/drivers/canopen/src/main/java/org/apache/plc4x/java/canopen/field/CANOpenSDOField.java
+++ b/plc4j/drivers/canopen/src/main/java/org/apache/plc4x/java/canopen/field/CANOpenSDOField.java
@@ -20,9 +20,12 @@ package org.apache.plc4x.java.canopen.field;
 
 import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
 import org.apache.plc4x.java.canopen.readwrite.types.CANOpenDataType;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 
+import java.nio.charset.StandardCharsets;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -105,6 +108,19 @@ public class CANOpenSDOField extends CANOpenField {
     }
 
     @Override
+    public void serialize(WriteBuffer writeBuffer) throws ParseException {
+        writeBuffer.pushContext(getClass().getSimpleName());
+
+        writeBuffer.writeInt("node",64, getNodeId());
+        writeBuffer.writeInt("index",64, getIndex());
+        writeBuffer.writeInt("subIndex",64, getSubIndex());
+        String dataTypeName = getCanOpenDataType().name();
+        writeBuffer.writeString("dataType", dataTypeName.getBytes(StandardCharsets.UTF_8).length * 8, StandardCharsets.UTF_8.name(), dataTypeName);
+
+        writeBuffer.popContext(getClass().getSimpleName());
+    }
+
+    @Override
     public void xmlSerialize(Element parent) {
         Document doc = parent.getOwnerDocument();
         Element messageElement = doc.createElement(getClass().getSimpleName());
diff --git a/plc4j/drivers/eip/src/main/java/org/apache/plc4x/java/eip/readwrite/field/EipField.java b/plc4j/drivers/eip/src/main/java/org/apache/plc4x/java/eip/readwrite/field/EipField.java
index a6f5199..5479a53 100644
--- a/plc4j/drivers/eip/src/main/java/org/apache/plc4x/java/eip/readwrite/field/EipField.java
+++ b/plc4j/drivers/eip/src/main/java/org/apache/plc4x/java/eip/readwrite/field/EipField.java
@@ -20,10 +20,13 @@ package org.apache.plc4x.java.eip.readwrite.field;
 
 import org.apache.plc4x.java.api.model.PlcField;
 import org.apache.plc4x.java.eip.readwrite.types.CIPDataTypeCode;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
 import org.apache.plc4x.java.spi.utils.XmlSerializable;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 
+import java.nio.charset.StandardCharsets;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -32,14 +35,14 @@ public class EipField implements PlcField, XmlSerializable {
     private static final Pattern ADDRESS_PATTERN =
         Pattern.compile("^%(?<tag>[a-zA-Z_.0-9]+\\[?[0-9]*\\]?):?(?<dataType>[A-Z]*):?(?<elementNb>[0-9]*)");
 
-    private static final String TAG="tag";
-    private static final String ELEMENTS="elementNb";
-    private static final String TYPE="dataType";
+    private static final String TAG = "tag";
+    private static final String ELEMENTS = "elementNb";
+    private static final String TYPE = "dataType";
 
 
     private final String tag;
     private CIPDataTypeCode type;
-    private int  elementNb;
+    private int elementNb;
 
     public CIPDataTypeCode getType() {
         return type;
@@ -81,31 +84,30 @@ public class EipField implements PlcField, XmlSerializable {
         this.type = type;
     }
 
-    public static boolean matches(String fieldQuery){
+    public static boolean matches(String fieldQuery) {
         return ADDRESS_PATTERN.matcher(fieldQuery).matches();
     }
 
-    public static EipField of(String fieldString){
+    public static EipField of(String fieldString) {
         Matcher matcher = ADDRESS_PATTERN.matcher(fieldString);
-        if(matcher.matches()){
+        if (matcher.matches()) {
             String tag = matcher.group(TAG);
-            int nb=0;
-            CIPDataTypeCode type=null;
-            if(!matcher.group(ELEMENTS).isEmpty()) {
+            int nb = 0;
+            CIPDataTypeCode type = null;
+            if (!matcher.group(ELEMENTS).isEmpty()) {
                 nb = Integer.parseInt(matcher.group(ELEMENTS));
             }
-            if(!matcher.group(TYPE).isEmpty()) {
+            if (!matcher.group(TYPE).isEmpty()) {
                 type = CIPDataTypeCode.valueOf(matcher.group(TYPE));
             }
-            if(nb!=0){
-                if(type!=null){
-                    return  new EipField(tag,type,nb);
+            if (nb != 0) {
+                if (type != null) {
+                    return new EipField(tag, type, nb);
                 }
                 return new EipField(tag, nb);
-            }
-            else{
-                if(type!=null){
-                    return  new EipField(tag,type);
+            } else {
+                if (type != null) {
+                    return new EipField(tag, type);
                 }
                 return new EipField(tag);
             }
@@ -120,7 +122,7 @@ public class EipField implements PlcField, XmlSerializable {
 
     @Override
     public Class<?> getDefaultJavaType() {
-        switch (type){
+        switch (type) {
             //ToDo differenciate Short, Integer and Long
             case INT:
             case DINT:
@@ -140,6 +142,20 @@ public class EipField implements PlcField, XmlSerializable {
     }
 
     @Override
+    public void serialize(WriteBuffer writeBuffer) throws ParseException {
+        writeBuffer.pushContext(getClass().getSimpleName());
+
+        writeBuffer.writeString("node", tag.getBytes(StandardCharsets.UTF_8).length * 8, StandardCharsets.UTF_8.name(), tag);
+        writeBuffer.writeString("type", type.name().getBytes(StandardCharsets.UTF_8).length * 8, StandardCharsets.UTF_8.name(), type.name());
+        writeBuffer.writeInt("elementNb", 64, elementNb);
+        // TODO: remove this (not language agnostic)
+        String defaultJavaType= (type == null ? Object.class : getDefaultJavaType()).getName();
+        writeBuffer.writeString("defaultJavaType", defaultJavaType.getBytes(StandardCharsets.UTF_8).length * 8, StandardCharsets.UTF_8.name(), defaultJavaType);
+
+        writeBuffer.popContext(getClass().getSimpleName());
+    }
+
+    @Override
     public void xmlSerialize(Element parent) {
         Document doc = parent.getOwnerDocument();
         Element messageElement = doc.createElement(getClass().getSimpleName());
diff --git a/plc4j/drivers/mock/src/main/java/org/apache/plc4x/java/mock/field/MockPlcValue.java b/plc4j/drivers/mock/src/main/java/org/apache/plc4x/java/mock/field/MockPlcValue.java
index c27e6a0..43d450e 100644
--- a/plc4j/drivers/mock/src/main/java/org/apache/plc4x/java/mock/field/MockPlcValue.java
+++ b/plc4j/drivers/mock/src/main/java/org/apache/plc4x/java/mock/field/MockPlcValue.java
@@ -20,6 +20,8 @@
 package org.apache.plc4x.java.mock.field;
 
 import org.apache.plc4x.java.api.exceptions.PlcNotImplementedException;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
 import org.apache.plc4x.java.spi.values.PlcValueAdapter;
 import org.w3c.dom.Element;
 
@@ -36,6 +38,11 @@ public class MockPlcValue extends PlcValueAdapter {
     }
 
     @Override
+    public void serialize(WriteBuffer writeBuffer) throws ParseException {
+        throw new PlcNotImplementedException("Not implemented");
+    }
+
+    @Override
     public void xmlSerialize(Element parent) {
         throw new PlcNotImplementedException("Not implemented");
     }
diff --git a/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/field/ModbusField.java b/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/field/ModbusField.java
index 0a750b5..e822aa5 100644
--- a/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/field/ModbusField.java
+++ b/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/field/ModbusField.java
@@ -22,10 +22,13 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
 import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
 import org.apache.plc4x.java.api.model.PlcField;
 import org.apache.plc4x.java.modbus.readwrite.types.*;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
 import org.apache.plc4x.java.spi.utils.XmlSerializable;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 
+import java.nio.charset.StandardCharsets;
 import java.util.Objects;
 import java.util.regex.Pattern;
 
@@ -43,19 +46,19 @@ public abstract class ModbusField implements PlcField, XmlSerializable {
     private final ModbusDataType dataType;
 
     public static ModbusField of(String addressString) {
-        if(ModbusFieldCoil.matches(addressString)) {
+        if (ModbusFieldCoil.matches(addressString)) {
             return ModbusFieldCoil.of(addressString);
         }
-        if(ModbusFieldDiscreteInput.matches(addressString)) {
+        if (ModbusFieldDiscreteInput.matches(addressString)) {
             return ModbusFieldDiscreteInput.of(addressString);
         }
-        if(ModbusFieldHoldingRegister.matches(addressString)) {
+        if (ModbusFieldHoldingRegister.matches(addressString)) {
             return ModbusFieldHoldingRegister.of(addressString);
         }
-        if(ModbusFieldInputRegister.matches(addressString)) {
+        if (ModbusFieldInputRegister.matches(addressString)) {
             return ModbusFieldInputRegister.of(addressString);
         }
-        if(ModbusExtendedRegister.matches(addressString)) {
+        if (ModbusExtendedRegister.matches(addressString)) {
             return ModbusExtendedRegister.of(addressString);
         }
         throw new PlcInvalidFieldException("Unable to parse address: " + addressString);
@@ -87,7 +90,7 @@ public abstract class ModbusField implements PlcField, XmlSerializable {
 
     @JsonIgnore
     public int getLengthWords() {
-        return (int) ((quantity * (float) dataType.getDataTypeSize())/2.0f);
+        return (int) ((quantity * (float) dataType.getDataTypeSize()) / 2.0f);
     }
 
     public ModbusDataType getDataType() {
@@ -126,6 +129,18 @@ public abstract class ModbusField implements PlcField, XmlSerializable {
     }
 
     @Override
+    public void serialize(WriteBuffer writeBuffer) throws ParseException {
+        writeBuffer.pushContext(getClass().getSimpleName());
+
+        writeBuffer.writeInt("address", 64, address);
+        writeBuffer.writeInt("numberOfElements", 64, getNumberOfElements());
+        String dataType = getPlcDataType();
+        writeBuffer.writeString("dataType", dataType.getBytes(StandardCharsets.UTF_8).length * 8, StandardCharsets.UTF_8.name(), dataType);
+
+        writeBuffer.popContext(getClass().getSimpleName());
+    }
+
+    @Override
     public void xmlSerialize(Element parent) {
         Document doc = parent.getOwnerDocument();
         Element messageElement = doc.createElement(getClass().getSimpleName());
diff --git a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/field/S7Field.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/field/S7Field.java
index 64b6aba..68ff4f2 100644
--- a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/field/S7Field.java
+++ b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/field/S7Field.java
@@ -34,10 +34,12 @@ import org.apache.plc4x.java.s7.readwrite.types.TransportSize;
 import org.apache.plc4x.java.spi.generation.ParseException;
 import org.apache.plc4x.java.spi.generation.ReadBuffer;
 import org.apache.plc4x.java.spi.generation.ReadBufferByteBased;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
 import org.apache.plc4x.java.spi.utils.XmlSerializable;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 
+import java.nio.charset.StandardCharsets;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
@@ -85,8 +87,8 @@ public class S7Field implements PlcField, XmlSerializable {
 
     @JsonCreator(mode = JsonCreator.Mode.PROPERTIES)
     protected S7Field(@JsonProperty("dataType") TransportSize dataType, @JsonProperty("memoryArea") MemoryArea memoryArea,
-                    @JsonProperty("blockNumber") int blockNumber, @JsonProperty("byteOffset") int byteOffset,
-                    @JsonProperty("bitOffset") byte bitOffset, @JsonProperty("numElements") int numElements) {
+                      @JsonProperty("blockNumber") int blockNumber, @JsonProperty("byteOffset") int byteOffset,
+                      @JsonProperty("bitOffset") byte bitOffset, @JsonProperty("numElements") int numElements) {
         this.dataType = dataType;
         this.memoryArea = memoryArea;
         this.blockNumber = blockNumber;
@@ -126,21 +128,21 @@ public class S7Field implements PlcField, XmlSerializable {
     public static boolean matches(String fieldString) {
         return
             DATA_BLOCK_STRING_ADDRESS_PATTERN.matcher(fieldString).matches() ||
-            DATA_BLOCK_STRING_SHORT_PATTERN.matcher(fieldString).matches() ||
-            DATA_BLOCK_ADDRESS_PATTERN.matcher(fieldString).matches() ||
-            DATA_BLOCK_SHORT_PATTERN.matcher(fieldString).matches() ||
-            PLC_PROXY_ADDRESS_PATTERN.matcher(fieldString).matches() ||
-            ADDRESS_PATTERN.matcher(fieldString).matches();
+                DATA_BLOCK_STRING_SHORT_PATTERN.matcher(fieldString).matches() ||
+                DATA_BLOCK_ADDRESS_PATTERN.matcher(fieldString).matches() ||
+                DATA_BLOCK_SHORT_PATTERN.matcher(fieldString).matches() ||
+                PLC_PROXY_ADDRESS_PATTERN.matcher(fieldString).matches() ||
+                ADDRESS_PATTERN.matcher(fieldString).matches();
     }
 
     /**
      * @return Java type of expected response.
-     *
+     * <p>
      * TODO validate all Methods existing are implemented
      */
     @Override
     public Class<?> getDefaultJavaType() {
-        switch (dataType){
+        switch (dataType) {
             case STRING:
                 return String.class;
             case USINT:
@@ -202,30 +204,30 @@ public class S7Field implements PlcField, XmlSerializable {
             int byteOffset = checkByteOffset(Integer.parseInt(matcher.group(BYTE_OFFSET)));
             byte bitOffset = 0;
             int numElements = 1;
-            if(matcher.group(NUM_ELEMENTS) != null) {
+            if (matcher.group(NUM_ELEMENTS) != null) {
                 numElements = Integer.parseInt(matcher.group(NUM_ELEMENTS));
             }
 
             return new S7StringField(dataType, memoryArea, blockNumber,
                 byteOffset, bitOffset, numElements, stringLength);
-        } else if((matcher = DATA_BLOCK_ADDRESS_PATTERN.matcher(fieldString)).matches()) {
+        } else if ((matcher = DATA_BLOCK_ADDRESS_PATTERN.matcher(fieldString)).matches()) {
             TransportSize dataType = TransportSize.valueOf(matcher.group(DATA_TYPE));
             MemoryArea memoryArea = MemoryArea.DATA_BLOCKS;
             Short transferSizeCode = getSizeCode(matcher.group(TRANSFER_SIZE_CODE));
             int blockNumber = checkDatablockNumber(Integer.parseInt(matcher.group(BLOCK_NUMBER)));
             int byteOffset = checkByteOffset(Integer.parseInt(matcher.group(BYTE_OFFSET)));
             byte bitOffset = 0;
-            if(matcher.group(BIT_OFFSET) != null) {
+            if (matcher.group(BIT_OFFSET) != null) {
                 bitOffset = Byte.parseByte(matcher.group(BIT_OFFSET));
-            } else if(dataType == TransportSize.BOOL) {
+            } else if (dataType == TransportSize.BOOL) {
                 throw new PlcInvalidFieldException("Expected bit offset for BOOL parameters.");
             }
             int numElements = 1;
-            if(matcher.group(NUM_ELEMENTS) != null) {
+            if (matcher.group(NUM_ELEMENTS) != null) {
                 numElements = Integer.parseInt(matcher.group(NUM_ELEMENTS));
             }
 
-            if((transferSizeCode != null) && (dataType.getShortName() != transferSizeCode)) {
+            if ((transferSizeCode != null) && (dataType.getShortName() != transferSizeCode)) {
                 throw new PlcInvalidFieldException("Transfer size code '" + transferSizeCode +
                     "' doesn't match specified data type '" + dataType.name() + "'");
             }
@@ -237,13 +239,13 @@ public class S7Field implements PlcField, XmlSerializable {
             int blockNumber = checkDatablockNumber(Integer.parseInt(matcher.group(BLOCK_NUMBER)));
             int byteOffset = checkByteOffset(Integer.parseInt(matcher.group(BYTE_OFFSET)));
             byte bitOffset = 0;
-            if(matcher.group(BIT_OFFSET) != null) {
+            if (matcher.group(BIT_OFFSET) != null) {
                 bitOffset = Byte.parseByte(matcher.group(BIT_OFFSET));
-            } else if(dataType == TransportSize.BOOL) {
+            } else if (dataType == TransportSize.BOOL) {
                 throw new PlcInvalidFieldException("Expected bit offset for BOOL parameters.");
             }
             int numElements = 1;
-            if(matcher.group(NUM_ELEMENTS) != null) {
+            if (matcher.group(NUM_ELEMENTS) != null) {
                 numElements = Integer.parseInt(matcher.group(NUM_ELEMENTS));
             }
 
@@ -300,12 +302,13 @@ public class S7Field implements PlcField, XmlSerializable {
 
     /**
      * checks if DatablockNumber of S7Field is in valid range
+     *
      * @param blockNumber given DatablockNumber
      * @return given blockNumber if Ok, throws PlcInvalidFieldException otherwise
      */
-    private static int checkDatablockNumber(int blockNumber){
+    private static int checkDatablockNumber(int blockNumber) {
         //ToDo check the value or add reference - limit eventually depending on active S7 --> make a case selection
-        if(blockNumber>64000 || blockNumber<1){
+        if (blockNumber > 64000 || blockNumber < 1) {
             throw new PlcInvalidFieldException("Datablock numbers larger than 64000 or smaller than 1 are not supported.");
         }
         return blockNumber;
@@ -313,22 +316,23 @@ public class S7Field implements PlcField, XmlSerializable {
 
     /**
      * checks if ByteOffset from S7Field is in valid range
+     *
      * @param byteOffset given byteOffset
      * @return given byteOffset if Ok, throws PlcInvalidFieldException otherwise
      */
-    private static int checkByteOffset(int byteOffset){
+    private static int checkByteOffset(int byteOffset) {
         //ToDo check the value or add reference
-        if(byteOffset>2097151 || byteOffset<0){
+        if (byteOffset > 2097151 || byteOffset < 0) {
             throw new PlcInvalidFieldException("ByteOffset must be smaller than 2097151 and positive.");
         }
         return byteOffset;
     }
 
     protected static Short getSizeCode(String value) {
-        if((value == null) || value.isEmpty()) {
+        if ((value == null) || value.isEmpty()) {
             return null;
         }
-        if(value.length() > 1) {
+        if (value.length() > 1) {
             return null;
         }
         return (short) value.getBytes()[0];
@@ -336,7 +340,7 @@ public class S7Field implements PlcField, XmlSerializable {
 
     protected static MemoryArea getMemoryAreaForShortName(String shortName) {
         for (MemoryArea memoryArea : MemoryArea.values()) {
-            if(memoryArea.getShortName().equals(shortName)) {
+            if (memoryArea.getShortName().equals(shortName)) {
                 return memoryArea;
             }
         }
@@ -356,6 +360,24 @@ public class S7Field implements PlcField, XmlSerializable {
     }
 
     @Override
+    public void serialize(WriteBuffer writeBuffer) throws ParseException {
+        writeBuffer.pushContext(getClass().getSimpleName());
+
+        String memoryArea = getMemoryArea().name();
+        writeBuffer.writeString("memoryArea", memoryArea.getBytes(StandardCharsets.UTF_8).length * 8, StandardCharsets.UTF_8.name(), memoryArea);
+
+        writeBuffer.writeInt("blockNumber", 64, getBlockNumber());
+        writeBuffer.writeInt("byteOffset", 64, getByteOffset());
+        writeBuffer.writeInt("bitOffset", 64, getBitOffset());
+        writeBuffer.writeInt("numElements", 64, getNumberOfElements());
+
+        String dataType = getDataType().name();
+        writeBuffer.writeString("dataType", dataType.getBytes(StandardCharsets.UTF_8).length * 8, StandardCharsets.UTF_8.name(), dataType);
+
+        writeBuffer.popContext(getClass().getSimpleName());
+    }
+
+    @Override
     public void xmlSerialize(Element parent) {
         Document doc = parent.getOwnerDocument();
         Element messageElement = doc.createElement(getClass().getSimpleName());
diff --git a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/field/S7StringField.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/field/S7StringField.java
index eeab916..de9276e 100644
--- a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/field/S7StringField.java
+++ b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/field/S7StringField.java
@@ -22,18 +22,22 @@ import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import org.apache.plc4x.java.s7.readwrite.types.MemoryArea;
 import org.apache.plc4x.java.s7.readwrite.types.TransportSize;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 
+import java.nio.charset.StandardCharsets;
+
 public class S7StringField extends S7Field {
 
     private final int stringLength;
 
     @JsonCreator(mode = JsonCreator.Mode.PROPERTIES)
     protected S7StringField(@JsonProperty("dataType") TransportSize dataType, @JsonProperty("memoryArea") MemoryArea memoryArea,
-                    @JsonProperty("blockNumber") int blockNumber, @JsonProperty("byteOffset") int byteOffset,
-                    @JsonProperty("bitOffset") byte bitOffset, @JsonProperty("numElements") int numElements,
-                    @JsonProperty("stringLength") int stringLength) {
+                            @JsonProperty("blockNumber") int blockNumber, @JsonProperty("byteOffset") int byteOffset,
+                            @JsonProperty("bitOffset") byte bitOffset, @JsonProperty("numElements") int numElements,
+                            @JsonProperty("stringLength") int stringLength) {
         super(dataType, memoryArea, blockNumber, byteOffset, bitOffset, numElements);
         this.stringLength = stringLength;
     }
@@ -43,12 +47,31 @@ public class S7StringField extends S7Field {
     }
 
     @Override
+    public void serialize(WriteBuffer writeBuffer) throws ParseException {
+        writeBuffer.pushContext(getClass().getSimpleName());
+
+        String memoryArea = getMemoryArea().name();
+        writeBuffer.writeString("memoryArea", memoryArea.getBytes(StandardCharsets.UTF_8).length * 8, StandardCharsets.UTF_8.name(), memoryArea);
+
+        writeBuffer.writeInt("blockNumber", 64, getBlockNumber());
+        writeBuffer.writeInt("byteOffset", 64, getByteOffset());
+        writeBuffer.writeInt("bitOffset", 64, getBitOffset());
+        writeBuffer.writeInt("numElements", 64, getNumberOfElements());
+        writeBuffer.writeInt("stringLength", 64, getStringLength());
+
+        String dataType = getDataType().name();
+        writeBuffer.writeString("dataType", dataType.getBytes(StandardCharsets.UTF_8).length * 8, StandardCharsets.UTF_8.name(), dataType);
+
+        writeBuffer.popContext(getClass().getSimpleName());
+    }
+
+    @Override
     public void xmlSerialize(Element parent) {
         super.xmlSerialize(parent);
 
         Document doc = parent.getOwnerDocument();
-        Element byteOffsetElement = doc.createElement("byteOffset");
-        byteOffsetElement.appendChild(doc.createTextNode(Integer.toString(getByteOffset())));
+        Element byteOffsetElement = doc.createElement("stringLength");
+        byteOffsetElement.appendChild(doc.createTextNode(Integer.toString(getStringLength())));
         parent.getFirstChild().appendChild(byteOffsetElement);
     }
 
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcReadRequest.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcReadRequest.java
index 26bfe38..715d5e1 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcReadRequest.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcReadRequest.java
@@ -26,6 +26,9 @@ import org.apache.plc4x.java.api.messages.PlcReadRequest;
 import org.apache.plc4x.java.api.messages.PlcReadResponse;
 import org.apache.plc4x.java.api.model.PlcField;
 import org.apache.plc4x.java.spi.connection.PlcFieldHandler;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
+import org.apache.plc4x.java.spi.utils.Serializable;
 import org.apache.plc4x.java.spi.utils.XmlSerializable;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
@@ -109,6 +112,26 @@ public class DefaultPlcReadRequest implements PlcReadRequest, PlcFieldRequest, X
     }
 
     @Override
+    public void serialize(WriteBuffer writeBuffer) throws ParseException {
+        writeBuffer.pushContext("PlcReadRequest");
+
+        writeBuffer.pushContext("fields");
+        for (Map.Entry<String, PlcField> fieldEntry : fields.entrySet()) {
+            String fieldName = fieldEntry.getKey();
+            writeBuffer.pushContext(fieldName);
+            PlcField field = fieldEntry.getValue();
+            if(!(field instanceof Serializable)) {
+                throw new RuntimeException("Error serializing. Field doesn't implement XmlSerializable");
+            }
+            ((Serializable) field).serialize(writeBuffer);
+            writeBuffer.popContext(fieldName);
+        }
+        writeBuffer.popContext("fields");
+
+        writeBuffer.popContext("PlcReadRequest");
+    }
+
+    @Override
     public void xmlSerialize(Element parent) {
         Document doc = parent.getOwnerDocument();
         Element messageElement = doc.createElement("PlcReadRequest");
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcReadResponse.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcReadResponse.java
index 1e6b24e..e81dd1f 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcReadResponse.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcReadResponse.java
@@ -25,6 +25,9 @@ import org.apache.plc4x.java.api.messages.PlcReadRequest;
 import org.apache.plc4x.java.api.messages.PlcReadResponse;
 import org.apache.plc4x.java.api.model.PlcField;
 import org.apache.plc4x.java.api.types.PlcResponseCode;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
+import org.apache.plc4x.java.spi.utils.Serializable;
 import org.apache.plc4x.java.spi.utils.XmlSerializable;
 import org.apache.plc4x.java.spi.values.PlcList;
 import org.apache.plc4x.java.api.value.PlcValue;
@@ -719,6 +722,25 @@ public class DefaultPlcReadResponse implements PlcReadResponse, XmlSerializable
         return field;
     }
 
+    @Override
+    public void serialize(WriteBuffer writeBuffer) throws ParseException {
+        writeBuffer.pushContext("PlcReadResponse");
+
+        if(request instanceof Serializable) {
+            ((Serializable) request).serialize(writeBuffer);
+        }
+        writeBuffer.pushContext("values");
+        for (Map.Entry<String, ResponseItem<PlcValue>> valueEntry : values.entrySet()) {
+            String fieldName = valueEntry.getKey();
+            writeBuffer.pushContext(fieldName);
+            ResponseItem<PlcValue> valueResponse = valueEntry.getValue();
+            valueResponse.serialize(writeBuffer);
+            writeBuffer.pushContext(fieldName);
+        }
+        writeBuffer.popContext("values");
+
+        writeBuffer.popContext("PlcReadResponse");
+    }
 
     @Override
     public void xmlSerialize(Element parent) {
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcSubscriptionRequest.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcSubscriptionRequest.java
index 95d3470..0dece02 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcSubscriptionRequest.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcSubscriptionRequest.java
@@ -29,8 +29,13 @@ import org.apache.plc4x.java.api.messages.PlcSubscriptionResponse;
 import org.apache.plc4x.java.api.model.PlcField;
 import org.apache.plc4x.java.api.model.PlcSubscriptionField;
 import org.apache.plc4x.java.api.types.PlcSubscriptionType;
+import org.apache.plc4x.java.api.value.PlcValue;
 import org.apache.plc4x.java.spi.connection.PlcFieldHandler;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
+import org.apache.plc4x.java.spi.messages.utils.ResponseItem;
 import org.apache.plc4x.java.spi.model.DefaultPlcSubscriptionField;
+import org.apache.plc4x.java.spi.utils.Serializable;
 import org.apache.plc4x.java.spi.utils.XmlSerializable;
 import org.w3c.dom.Element;
 
@@ -96,6 +101,26 @@ public class DefaultPlcSubscriptionRequest implements PlcSubscriptionRequest, Xm
     }
 
     @Override
+    public void serialize(WriteBuffer writeBuffer) throws ParseException {
+        writeBuffer.pushContext("PlcSubscriptionRequest");
+
+        writeBuffer.pushContext("fields");
+        for (Map.Entry<String, PlcSubscriptionField> fieldEntry : fields.entrySet()) {
+            String fieldName = fieldEntry.getKey();
+            writeBuffer.pushContext(fieldName);
+            PlcField field = fieldEntry.getValue();
+            if(!(field instanceof Serializable)) {
+                throw new RuntimeException("Error serializing. Field doesn't implement XmlSerializable");
+            }
+            ((Serializable) field).serialize(writeBuffer);
+            writeBuffer.popContext(fieldName);
+        }
+        writeBuffer.popContext("fields");
+
+        writeBuffer.popContext("PlcSubscriptionRequest");
+    }
+
+    @Override
     public void xmlSerialize(Element parent) {
         // TODO: Implement
     }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcSubscriptionResponse.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcSubscriptionResponse.java
index 741bd93..f56cd47 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcSubscriptionResponse.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcSubscriptionResponse.java
@@ -30,7 +30,11 @@ import org.apache.plc4x.java.api.messages.PlcSubscriptionResponse;
 import org.apache.plc4x.java.api.model.PlcSubscriptionField;
 import org.apache.plc4x.java.api.model.PlcSubscriptionHandle;
 import org.apache.plc4x.java.api.types.PlcResponseCode;
+import org.apache.plc4x.java.api.value.PlcValue;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
 import org.apache.plc4x.java.spi.messages.utils.ResponseItem;
+import org.apache.plc4x.java.spi.utils.Serializable;
 import org.apache.plc4x.java.spi.utils.XmlSerializable;
 import org.w3c.dom.Element;
 
@@ -103,6 +107,26 @@ public class DefaultPlcSubscriptionResponse implements PlcSubscriptionResponse,
     }
 
     @Override
+    public void serialize(WriteBuffer writeBuffer) throws ParseException {
+        writeBuffer.pushContext("PlcSubscriptionResponse");
+
+        if(request instanceof Serializable) {
+            ((Serializable) request).serialize(writeBuffer);
+        }
+        writeBuffer.pushContext("values");
+        for (Map.Entry<String, ResponseItem<PlcSubscriptionHandle>> valueEntry : values.entrySet()) {
+            String fieldName = valueEntry.getKey();
+            writeBuffer.pushContext(fieldName);
+            ResponseItem<PlcSubscriptionHandle> valueResponse = valueEntry.getValue();
+            valueResponse.serialize(writeBuffer);
+            writeBuffer.pushContext(fieldName);
+        }
+        writeBuffer.popContext("values");
+
+        writeBuffer.popContext("PlcSubscriptionResponse");
+    }
+
+    @Override
     public void xmlSerialize(Element parent) {
         // TODO: Implement
     }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcUnsubscriptionRequest.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcUnsubscriptionRequest.java
index c05d8d5..a85e5a4 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcUnsubscriptionRequest.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcUnsubscriptionRequest.java
@@ -26,13 +26,14 @@ import org.apache.plc4x.java.api.messages.PlcRequest;
 import org.apache.plc4x.java.api.messages.PlcUnsubscriptionRequest;
 import org.apache.plc4x.java.api.messages.PlcUnsubscriptionResponse;
 import org.apache.plc4x.java.api.model.PlcSubscriptionHandle;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
+import org.apache.plc4x.java.spi.messages.utils.ResponseItem;
+import org.apache.plc4x.java.spi.utils.Serializable;
 import org.apache.plc4x.java.spi.utils.XmlSerializable;
 import org.w3c.dom.Element;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
+import java.util.*;
 import java.util.concurrent.CompletableFuture;
 import java.util.stream.Collectors;
 
@@ -70,6 +71,11 @@ public class DefaultPlcUnsubscriptionRequest implements PlcUnsubscriptionRequest
     }
 
     @Override
+    public void serialize(WriteBuffer writeBuffer) throws ParseException {
+        // TODO: Implement
+    }
+
+    @Override
     public void xmlSerialize(Element parent) {
         // TODO: Implement
     }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcUnsubscriptionResponse.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcUnsubscriptionResponse.java
index 5887e2d..053784b 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcUnsubscriptionResponse.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcUnsubscriptionResponse.java
@@ -24,6 +24,8 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo;
 import org.apache.plc4x.java.api.messages.PlcResponse;
 import org.apache.plc4x.java.api.messages.PlcUnsubscriptionRequest;
 import org.apache.plc4x.java.api.messages.PlcUnsubscriptionResponse;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
 import org.apache.plc4x.java.spi.utils.XmlSerializable;
 import org.w3c.dom.Element;
 
@@ -43,6 +45,11 @@ public class DefaultPlcUnsubscriptionResponse implements PlcUnsubscriptionRespon
     }
 
     @Override
+    public void serialize(WriteBuffer writeBuffer) throws ParseException {
+        // TODO: Implement
+    }
+
+    @Override
     public void xmlSerialize(Element parent) {
         // TODO: Implement
     }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcWriteRequest.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcWriteRequest.java
index c010ff0..e3df40c 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcWriteRequest.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcWriteRequest.java
@@ -28,6 +28,9 @@ import org.apache.plc4x.java.api.messages.PlcFieldRequest;
 import org.apache.plc4x.java.api.messages.PlcWriteRequest;
 import org.apache.plc4x.java.api.messages.PlcWriteResponse;
 import org.apache.plc4x.java.api.model.PlcField;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
+import org.apache.plc4x.java.spi.utils.Serializable;
 import org.apache.plc4x.java.spi.utils.XmlSerializable;
 import org.apache.plc4x.java.spi.values.PlcList;
 import org.apache.plc4x.java.api.value.PlcValue;
@@ -37,6 +40,7 @@ import org.apache.plc4x.java.spi.messages.utils.FieldValueItem;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 
+import java.nio.charset.StandardCharsets;
 import java.util.LinkedHashMap;
 import java.util.LinkedHashSet;
 import java.util.LinkedList;
@@ -134,7 +138,7 @@ public class DefaultPlcWriteRequest implements PlcWriteRequest, XmlSerializable
     @JsonIgnore
     public int getNumberOfValues(String name) {
         final PlcValue value = fields.get(name).getValue();
-        if(value instanceof PlcList) {
+        if (value instanceof PlcList) {
             PlcList list = (PlcList) value;
             return list.getLength();
         }
@@ -142,6 +146,38 @@ public class DefaultPlcWriteRequest implements PlcWriteRequest, XmlSerializable
     }
 
     @Override
+    public void serialize(WriteBuffer writeBuffer) throws ParseException {
+        writeBuffer.pushContext("PlcWriteRequest");
+
+        writeBuffer.pushContext("fields");
+        for (Map.Entry<String, FieldValueItem> fieldEntry : fields.entrySet()) {
+            FieldValueItem fieldValueItem = fieldEntry.getValue();
+            String fieldName = fieldEntry.getKey();
+            writeBuffer.pushContext(fieldName);
+            PlcField field = fieldValueItem.getField();
+            if (!(field instanceof Serializable)) {
+                throw new RuntimeException("Error serializing. Field doesn't implement XmlSerializable");
+            }
+            ((Serializable) field).serialize(writeBuffer);
+            final PlcValue value = fieldValueItem.getValue();
+            if (value instanceof PlcList) {
+                PlcList list = (PlcList) value;
+                for (PlcValue plcValue : list.getList()) {
+                    String plcValueString = plcValue.getString();
+                    writeBuffer.writeString("value", plcValueString.getBytes(StandardCharsets.UTF_8).length * 8, StandardCharsets.UTF_8.name(), plcValueString);
+                }
+            } else {
+                String plcValueString = value.getString();
+                writeBuffer.writeString("value", plcValueString.getBytes(StandardCharsets.UTF_8).length * 8, StandardCharsets.UTF_8.name(), plcValueString);
+            }
+            writeBuffer.popContext(fieldName);
+        }
+        writeBuffer.popContext("fields");
+
+        writeBuffer.popContext("PlcWriteRequest");
+    }
+
+    @Override
     public void xmlSerialize(Element parent) {
         Document doc = parent.getOwnerDocument();
         Element messageElement = doc.createElement("PlcWriteRequest");
@@ -153,12 +189,12 @@ public class DefaultPlcWriteRequest implements PlcWriteRequest, XmlSerializable
             Element fieldNameElement = doc.createElement(fieldName);
             fieldsElement.appendChild(fieldNameElement);
             PlcField field = fieldValueItem.getField();
-            if(!(field instanceof XmlSerializable)) {
+            if (!(field instanceof XmlSerializable)) {
                 throw new RuntimeException("Error serializing. Field doesn't implement XmlSerializable");
             }
             ((XmlSerializable) field).xmlSerialize(fieldNameElement);
             final PlcValue value = fieldValueItem.getValue();
-            if(value instanceof PlcList) {
+            if (value instanceof PlcList) {
                 PlcList list = (PlcList) value;
                 for (PlcValue plcValue : list.getList()) {
                     Element fieldValueElement = doc.createElement("value");
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcWriteResponse.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcWriteResponse.java
index 6d8f3d7..11e8610 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcWriteResponse.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcWriteResponse.java
@@ -27,11 +27,15 @@ import org.apache.plc4x.java.api.messages.PlcWriteResponse;
 import org.apache.plc4x.java.api.model.PlcField;
 import org.apache.plc4x.java.api.types.PlcResponseCode;
 import org.apache.plc4x.java.api.value.PlcValue;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
 import org.apache.plc4x.java.spi.messages.utils.ResponseItem;
+import org.apache.plc4x.java.spi.utils.Serializable;
 import org.apache.plc4x.java.spi.utils.XmlSerializable;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 
+import java.nio.charset.StandardCharsets;
 import java.util.Collection;
 import java.util.Map;
 
@@ -72,6 +76,25 @@ public class DefaultPlcWriteResponse implements PlcWriteResponse, XmlSerializabl
     }
 
     @Override
+    public void serialize(WriteBuffer writeBuffer) throws ParseException {
+        writeBuffer.pushContext("PlcWriteResponse");
+
+        if(request instanceof Serializable) {
+            ((Serializable) request).serialize(writeBuffer);
+        }
+        writeBuffer.pushContext("fields");
+        for (Map.Entry<String, PlcResponseCode> fieldEntry : values.entrySet()) {
+            String fieldName = fieldEntry.getKey();
+            final PlcResponseCode fieldResponseCode = fieldEntry.getValue();
+            String result = fieldResponseCode.name();
+            writeBuffer.writeString(fieldName, result.getBytes(StandardCharsets.UTF_8).length * 8, StandardCharsets.UTF_8.name(), result);
+        }
+        writeBuffer.popContext("fields");
+
+        writeBuffer.popContext("PlcWriteResponse");
+    }
+
+    @Override
     public void xmlSerialize(Element parent) {
         Document doc = parent.getOwnerDocument();
         Element messageElement = doc.createElement("PlcWriteResponse");
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/utils/ResponseItem.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/utils/ResponseItem.java
index f1c10df..7063985 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/utils/ResponseItem.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/utils/ResponseItem.java
@@ -19,9 +19,14 @@ under the License.
 package org.apache.plc4x.java.spi.messages.utils;
 
 import org.apache.plc4x.java.api.types.PlcResponseCode;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
+import org.apache.plc4x.java.spi.utils.Serializable;
 import org.apache.plc4x.java.spi.utils.XmlSerializable;
 import org.w3c.dom.Element;
 
+import java.nio.charset.StandardCharsets;
+
 public class ResponseItem<T> implements XmlSerializable {
 
     private final PlcResponseCode code;
@@ -41,9 +46,23 @@ public class ResponseItem<T> implements XmlSerializable {
     }
 
     @Override
+    public void serialize(WriteBuffer writeBuffer) throws ParseException {
+        writeBuffer.pushContext("ResponseItem");
+        String codeName = code.name();
+        writeBuffer.writeString("result", codeName.getBytes(StandardCharsets.UTF_8).length * 8, StandardCharsets.UTF_8.name(), codeName);
+        if (value != null) {
+            if (!(value instanceof Serializable)) {
+                throw new RuntimeException("Error serializing. Field value doesn't implement XmlSerializable");
+            }
+            ((Serializable) value).serialize(writeBuffer);
+        }
+        writeBuffer.popContext("ResponseItem");
+    }
+
+    @Override
     public void xmlSerialize(Element parent) {
         parent.setAttribute("result", code.name());
-        if(value != null) {
+        if (value != null) {
             if (!(value instanceof XmlSerializable)) {
                 throw new RuntimeException("Error serializing. Field value doesn't implement XmlSerializable");
             }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/utils/XmlSerializable.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/utils/Serializable.java
similarity index 78%
copy from plc4j/spi/src/main/java/org/apache/plc4x/java/spi/utils/XmlSerializable.java
copy to plc4j/spi/src/main/java/org/apache/plc4x/java/spi/utils/Serializable.java
index 0a94b85..37f234a 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/utils/XmlSerializable.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/utils/Serializable.java
@@ -18,10 +18,9 @@ under the License.
 */
 package org.apache.plc4x.java.spi.utils;
 
-import org.w3c.dom.Element;
-
-public interface XmlSerializable {
-
-    void xmlSerialize(Element parent);
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
 
+public interface Serializable {
+    void serialize(WriteBuffer writeBuffer) throws ParseException;
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/utils/XmlSerializable.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/utils/XmlSerializable.java
index 0a94b85..f124fde 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/utils/XmlSerializable.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/utils/XmlSerializable.java
@@ -20,8 +20,13 @@ package org.apache.plc4x.java.spi.utils;
 
 import org.w3c.dom.Element;
 
-public interface XmlSerializable {
+/**
+ * @deprecated use the {@link Serializable} interface in combination with the {@link org.apache.plc4x.java.spi.generation.WriteBufferXmlBased} to produce xml.
+ */
+@Deprecated
+public interface XmlSerializable extends Serializable {
 
+    @Deprecated
     void xmlSerialize(Element parent);
 
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcBigDecimal.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcBigDecimal.java
index 538a182..a6fa577 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcBigDecimal.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcBigDecimal.java
@@ -23,6 +23,8 @@ import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonTypeInfo;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
 import org.w3c.dom.Element;
 
 import java.math.BigDecimal;
@@ -163,6 +165,11 @@ public class PlcBigDecimal extends PlcSimpleValue<BigDecimal> {
     }
 
     @Override
+    public void serialize(WriteBuffer writeBuffer) throws ParseException {
+        // TODO: Implement
+    }
+
+    @Override
     public void xmlSerialize(Element parent) {
         // TODO: Implement
     }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcBigInteger.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcBigInteger.java
index 3864e71..c37d05f 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcBigInteger.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcBigInteger.java
@@ -23,6 +23,8 @@ import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonTypeInfo;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
 import org.w3c.dom.Element;
 
 import java.math.BigDecimal;
@@ -163,6 +165,11 @@ public class PlcBigInteger extends PlcSimpleValue<BigInteger> {
     }
 
     @Override
+    public void serialize(WriteBuffer writeBuffer) throws ParseException {
+        // TODO: Implement
+    }
+
+    @Override
     public void xmlSerialize(Element parent) {
         // TODO: Implement
     }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcDATE.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcDATE.java
index 0567108..96fe580 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcDATE.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcDATE.java
@@ -24,6 +24,8 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonTypeInfo;
 import org.apache.plc4x.java.api.exceptions.PlcRuntimeException;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
 import org.w3c.dom.Element;
 
 import java.time.Instant;
@@ -94,6 +96,11 @@ public class PlcDATE extends PlcSimpleValue<LocalDate> {
     }
 
     @Override
+    public void serialize(WriteBuffer writeBuffer) throws ParseException {
+        // TODO: Implement
+    }
+
+    @Override
     public void xmlSerialize(Element parent) {
         // TODO: Implement
     }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcDATE_AND_TIME.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcDATE_AND_TIME.java
index 9a846ff..8f671e3 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcDATE_AND_TIME.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcDATE_AND_TIME.java
@@ -24,6 +24,8 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonTypeInfo;
 import org.apache.plc4x.java.api.exceptions.PlcRuntimeException;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
 import org.w3c.dom.Element;
 
 import java.time.*;
@@ -107,6 +109,11 @@ public class PlcDATE_AND_TIME extends PlcSimpleValue<LocalDateTime> {
     }
 
     @Override
+    public void serialize(WriteBuffer writeBuffer) throws ParseException {
+        // TODO: Implement
+    }
+
+    @Override
     public void xmlSerialize(Element parent) {
         // TODO: Implement
     }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcIECValue.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcIECValue.java
index 9774f1c..0a36bbc 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcIECValue.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcIECValue.java
@@ -21,9 +21,13 @@ package org.apache.plc4x.java.spi.values;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import org.apache.plc4x.java.api.value.PlcValue;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 
+import java.nio.charset.StandardCharsets;
+
 public abstract class PlcIECValue<T> extends PlcValueAdapter {
 
     T value;
@@ -79,6 +83,12 @@ public abstract class PlcIECValue<T> extends PlcValueAdapter {
     }
 
     @Override
+    public void serialize(WriteBuffer writeBuffer) throws ParseException {
+        String valueString = value.toString();
+        writeBuffer.writeString(getClass().getSimpleName(), valueString.getBytes(StandardCharsets.UTF_8).length*8,StandardCharsets.UTF_8.name(),valueString);
+    }
+
+    @Override
     public void xmlSerialize(Element parent) {
         Document doc = parent.getOwnerDocument();
         Element plcValueElement = doc.createElement(getClass().getSimpleName());
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcLTIME.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcLTIME.java
index 6e0bfbe..6f06a04 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcLTIME.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcLTIME.java
@@ -23,6 +23,8 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonTypeInfo;
 import org.apache.plc4x.java.api.exceptions.PlcRuntimeException;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
 import org.w3c.dom.Element;
 
 import java.math.BigInteger;
@@ -89,6 +91,11 @@ public class PlcLTIME extends PlcSimpleValue<Duration> {
     }
 
     @Override
+    public void serialize(WriteBuffer writeBuffer) throws ParseException {
+        // TODO: Implement
+    }
+
+    @Override
     public void xmlSerialize(Element parent) {
         // TODO: Implement
     }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcList.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcList.java
index 92b1f92..625dfe3 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcList.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcList.java
@@ -22,6 +22,9 @@ package org.apache.plc4x.java.spi.values;
 import com.fasterxml.jackson.annotation.*;
 import org.apache.plc4x.java.api.exceptions.PlcRuntimeException;
 import org.apache.plc4x.java.api.value.PlcValue;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
+import org.apache.plc4x.java.spi.utils.Serializable;
 import org.apache.plc4x.java.spi.utils.XmlSerializable;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
@@ -90,6 +93,18 @@ public class PlcList extends PlcValueAdapter {
     }
 
     @Override
+    public void serialize(WriteBuffer writeBuffer) throws ParseException {
+        writeBuffer.pushContext("PlcList");
+        for (PlcValue listItem : listItems) {
+            if (!(listItem instanceof Serializable)) {
+                throw new PlcRuntimeException("Error serializing. List item doesn't implement XmlSerializable");
+            }
+            ((Serializable) listItem).serialize(writeBuffer);
+        }
+        writeBuffer.popContext("PlcList");
+    }
+
+    @Override
     public void xmlSerialize(Element parent) {
         Document doc = parent.getOwnerDocument();
         Element plcValueElement = doc.createElement("PlcList");
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcSTRING.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcSTRING.java
index f90239a..67d5d07 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcSTRING.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcSTRING.java
@@ -23,6 +23,8 @@ import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonTypeInfo;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
 import org.w3c.dom.Element;
 
 import java.math.BigDecimal;
@@ -230,6 +232,11 @@ public class PlcSTRING extends PlcSimpleValue<String> {
     }
 
     @Override
+    public void serialize(WriteBuffer writeBuffer) throws ParseException {
+        // TODO: Implement
+    }
+
+    @Override
     public void xmlSerialize(Element parent) {
         // TODO: Implement
     }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcStruct.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcStruct.java
index b6c186a..c262eb2 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcStruct.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcStruct.java
@@ -25,6 +25,9 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonTypeInfo;
 import org.apache.plc4x.java.api.exceptions.PlcRuntimeException;
 import org.apache.plc4x.java.api.value.PlcValue;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
+import org.apache.plc4x.java.spi.utils.Serializable;
 import org.apache.plc4x.java.spi.utils.XmlSerializable;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
@@ -87,6 +90,22 @@ public class PlcStruct extends PlcValueAdapter {
     }
 
     @Override
+    public void serialize(WriteBuffer writeBuffer) throws ParseException {
+        writeBuffer.pushContext("PlcStruct");
+        for (Map.Entry<String, PlcValue> entry : map.entrySet()) {
+            String fieldName = entry.getKey();
+            writeBuffer.pushContext(fieldName);
+            PlcValue fieldValue = entry.getValue();
+            if (!(fieldValue instanceof Serializable)) {
+                throw new PlcRuntimeException("Error serializing. List item doesn't implement XmlSerializable");
+            }
+            ((Serializable) fieldValue).serialize(writeBuffer);
+            writeBuffer.pushContext(fieldName);
+        }
+        writeBuffer.popContext("PlcStruct");
+    }
+
+    @Override
     public void xmlSerialize(Element parent) {
         Document doc = parent.getOwnerDocument();
         Element plcValueElement = doc.createElement("PlcStruct");
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcTIME.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcTIME.java
index abfa5a1..76f83da 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcTIME.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcTIME.java
@@ -23,6 +23,8 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonTypeInfo;
 import org.apache.plc4x.java.api.exceptions.PlcRuntimeException;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
 import org.w3c.dom.Element;
 
 import java.time.Duration;
@@ -84,6 +86,11 @@ public class PlcTIME extends PlcSimpleValue<Duration> {
     }
 
     @Override
+    public void serialize(WriteBuffer writeBuffer) throws ParseException {
+        // TODO: Implement
+    }
+
+    @Override
     public void xmlSerialize(Element parent) {
         // TODO: Implement
     }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcTIME_OF_DAY.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcTIME_OF_DAY.java
index 4f59c74..3ff2da4 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcTIME_OF_DAY.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcTIME_OF_DAY.java
@@ -24,6 +24,8 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonTypeInfo;
 import org.apache.plc4x.java.api.exceptions.PlcRuntimeException;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
 import org.w3c.dom.Element;
 
 import java.time.LocalTime;
@@ -81,6 +83,11 @@ public class PlcTIME_OF_DAY extends PlcSimpleValue<LocalTime> {
     }
 
     @Override
+    public void serialize(WriteBuffer writeBuffer) throws ParseException {
+        // TODO: Implement
+    }
+
+    @Override
     public void xmlSerialize(Element parent) {
         // TODO: Implement
     }