You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by cd...@apache.org on 2020/06/18 15:53:55 UTC

[plc4x] branch feature/c-code-generation-tagged-unions updated: - Started implementing the different types of serializers for the fields (WIP)

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

cdutz pushed a commit to branch feature/c-code-generation-tagged-unions
in repository https://gitbox.apache.org/repos/asf/plc4x.git


The following commit(s) were added to refs/heads/feature/c-code-generation-tagged-unions by this push:
     new 1899fcf  - Started implementing the different types of serializers for the fields (WIP)
1899fcf is described below

commit 1899fcf4227966f3b928c3f078495d22e63d10f3
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Thu Jun 18 17:53:47 2020 +0200

    - Started implementing the different types of serializers for the fields (WIP)
---
 .../BaseFreemarkerLanguageTemplateHelper.java      |   2 +-
 .../plc4x/language/c/CLanguageTemplateHelper.java  |  55 ++++++-
 .../resources/templates/c/pojo-template-c.ftlh     | 169 ++++++++++++++++++++-
 .../language/java/JavaLanguageTemplateHelper.java  |   2 +-
 .../resources/templates/java/data-io-template.ftlh |   8 +-
 .../main/resources/templates/java/io-template.ftlh |  20 +--
 sandbox/plc4c/api/include/plc4c/utils/list.h       |   2 +
 .../modbus/src/modbus_constants.c                  |   6 +-
 .../generated-sources/modbus/src/modbus_pdu.c      |   9 +-
 .../src/modbus_pdu_read_file_record_request_item.c |   3 +-
 .../modbus_pdu_read_file_record_response_item.c    |  12 +-
 .../modbus_pdu_write_file_record_request_item.c    |  12 +-
 .../modbus_pdu_write_file_record_response_item.c   |  12 +-
 .../modbus/src/modbus_serial_adu.c                 |   3 +-
 .../generated-sources/modbus/src/modbus_tcp_adu.c  |   6 +-
 .../plc4c/generated-sources/s7/src/cotp_packet.c   |  27 +++-
 .../generated-sources/s7/src/cotp_parameter.c      |   6 +-
 .../plc4c/generated-sources/s7/src/s7_address.c    |   6 +-
 .../plc4c/generated-sources/s7/src/s7_message.c    |  27 +++-
 .../plc4c/generated-sources/s7/src/s7_parameter.c  |   6 +-
 .../s7/src/s7_parameter_user_data_item.c           |   6 +-
 .../plc4c/generated-sources/s7/src/s7_payload.c    |   3 +-
 .../s7/src/s7_payload_user_data_item.c             |   9 +-
 .../s7/src/s7_var_payload_data_item.c              |  18 ++-
 .../s7/src/s7_var_payload_status_item.c            |   6 +-
 .../s7/src/s7_var_request_parameter_item.c         |   6 +-
 .../generated-sources/s7/src/szl_data_tree_item.c  |  12 +-
 sandbox/plc4c/generated-sources/s7/src/szl_id.c    |   9 +-
 .../plc4c/generated-sources/s7/src/tpkt_packet.c   |   6 +-
 29 files changed, 426 insertions(+), 42 deletions(-)

diff --git a/build-utils/language-base-freemarker/src/main/java/org/apache/plc4x/plugins/codegenerator/protocol/freemarker/BaseFreemarkerLanguageTemplateHelper.java b/build-utils/language-base-freemarker/src/main/java/org/apache/plc4x/plugins/codegenerator/protocol/freemarker/BaseFreemarkerLanguageTemplateHelper.java
index 093e726..ee16231 100644
--- a/build-utils/language-base-freemarker/src/main/java/org/apache/plc4x/plugins/codegenerator/protocol/freemarker/BaseFreemarkerLanguageTemplateHelper.java
+++ b/build-utils/language-base-freemarker/src/main/java/org/apache/plc4x/plugins/codegenerator/protocol/freemarker/BaseFreemarkerLanguageTemplateHelper.java
@@ -115,7 +115,7 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
 
     public abstract String getReadBufferReadMethodCall(SimpleTypeReference simpleTypeReference);
 
-    public abstract String getWriteBufferReadMethodCall(SimpleTypeReference simpleTypeReference, String fieldName);
+    public abstract String getWriteBufferWriteMethodCall(SimpleTypeReference simpleTypeReference, String fieldName);
 
     public abstract String getNullValueForTypeReference(TypeReference typeReference);
 
diff --git a/build-utils/language-c/src/main/java/org/apache/plc4x/language/c/CLanguageTemplateHelper.java b/build-utils/language-c/src/main/java/org/apache/plc4x/language/c/CLanguageTemplateHelper.java
index bc3d686..90465a2 100644
--- a/build-utils/language-c/src/main/java/org/apache/plc4x/language/c/CLanguageTemplateHelper.java
+++ b/build-utils/language-c/src/main/java/org/apache/plc4x/language/c/CLanguageTemplateHelper.java
@@ -19,7 +19,6 @@ under the License.
 package org.apache.plc4x.language.c;
 
 import org.apache.commons.lang3.math.NumberUtils;
-import org.apache.commons.text.WordUtils;
 import org.apache.plc4x.plugins.codegenerator.protocol.freemarker.BaseFreemarkerLanguageTemplateHelper;
 import org.apache.plc4x.plugins.codegenerator.types.definitions.*;
 import org.apache.plc4x.plugins.codegenerator.types.enums.EnumValue;
@@ -395,8 +394,58 @@ public class CLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelpe
     }
 
     @Override
-    public String getWriteBufferReadMethodCall(SimpleTypeReference simpleTypeReference, String fieldName) {
-        return null;
+    public String getWriteBufferWriteMethodCall(SimpleTypeReference simpleTypeReference, String fieldName) {
+        switch (simpleTypeReference.getBaseType()) {
+            case BIT: {
+                return "plc4c_spi_write_bit(buf, " + fieldName + ")";
+            }
+            case UINT: {
+                IntegerTypeReference integerTypeReference = (IntegerTypeReference) simpleTypeReference;
+                if (integerTypeReference.getSizeInBits() <= 4) {
+                    return "plc4c_spi_write_unsigned_byte(buf, " + integerTypeReference.getSizeInBits() + ", " + fieldName + ")";
+                }
+                if (integerTypeReference.getSizeInBits() <= 8) {
+                    return "plc4c_spi_write_unsigned_short(buf, " + integerTypeReference.getSizeInBits() + ", " + fieldName + ")";
+                }
+                if (integerTypeReference.getSizeInBits() <= 16) {
+                    return "plc4c_spi_write_unsigned_int(buf, " + integerTypeReference.getSizeInBits() + ", " + fieldName + ")";
+                }
+                if (integerTypeReference.getSizeInBits() <= 32) {
+                    return "plc4c_spi_write_unsigned_long(buf, " + integerTypeReference.getSizeInBits() + ", " + fieldName + ")";
+                }
+                return "plc4c_spi_write_unsigned_big_integer(buf, " + integerTypeReference.getSizeInBits() + ", " + fieldName + ")";
+            }
+            case INT: {
+                IntegerTypeReference integerTypeReference = (IntegerTypeReference) simpleTypeReference;
+                if (integerTypeReference.getSizeInBits() <= 8) {
+                    return "plc4c_spi_write_byte(buf, " + integerTypeReference.getSizeInBits() + ", " + fieldName + ")";
+                }
+                if (integerTypeReference.getSizeInBits() <= 16) {
+                    return "plc4c_spi_write_short(buf, " + integerTypeReference.getSizeInBits() + ", " + fieldName + ")";
+                }
+                if (integerTypeReference.getSizeInBits() <= 32) {
+                    return "plc4c_spi_write_int(buf, " + integerTypeReference.getSizeInBits() + ", " + fieldName + ")";
+                }
+                if (integerTypeReference.getSizeInBits() <= 64) {
+                    return "plc4c_spi_write_long(buf, " + integerTypeReference.getSizeInBits() + ", " + fieldName + ")";
+                }
+                return "plc4c_spi_write_big_integer(buf, " + integerTypeReference.getSizeInBits() + ", " + fieldName + ")";
+            }
+            case FLOAT: {
+                FloatTypeReference floatTypeReference = (FloatTypeReference) simpleTypeReference;
+                if (floatTypeReference.getSizeInBits() <= 32) {
+                    return "plc4c_spi_write_float(buf, " + floatTypeReference.getSizeInBits() + ", " + fieldName + ")";
+                } else {
+                    return "plc4c_spi_write_double(buf, " + floatTypeReference.getSizeInBits() + ", " + fieldName + ")";
+                }
+            }
+            case STRING: {
+                StringTypeReference stringTypeReference = (StringTypeReference) simpleTypeReference;
+                return "plc4c_spi_write_string(buf, " + stringTypeReference.getSizeInBits() + ", \"" +
+                    stringTypeReference.getEncoding() + "\", " + fieldName + ")";
+            }
+        }
+        throw new RuntimeException("Unsupported type");
     }
 
     @Override
diff --git a/build-utils/language-c/src/main/resources/templates/c/pojo-template-c.ftlh b/build-utils/language-c/src/main/resources/templates/c/pojo-template-c.ftlh
index 0b7f6f2..28d6226 100644
--- a/build-utils/language-c/src/main/resources/templates/c/pojo-template-c.ftlh
+++ b/build-utils/language-c/src/main/resources/templates/c/pojo-template-c.ftlh
@@ -342,7 +342,174 @@ plc4c_return_code plc4c_${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_b
   return OK;
 }
 
-plc4c_return_code plc4c_${helper.getCTypeName(type.name)}_serialize(plc4c_spi_write_buffer* buf, plc4c_${helper.getCTypeName(type.name)}* message) {
+plc4c_return_code plc4c_${helper.getCTypeName(type.name)}_serialize(plc4c_spi_write_buffer* buf, plc4c_${helper.getCTypeName(type.name)}* _message) {
+<#macro fieldSerializer baseType field indentContent>
+    <#switch field.typeName>
+        <#case "array">
+            <#assign arrayField = field>
+
+<#if indentContent>  </#if>  // Array field (${arrayField.name})
+<#if indentContent>  </#if>  {
+<#if indentContent>  </#if>    uint8_t itemCount = plc4c_utils_list_size(_message-><@fieldName baseType=baseType field=arrayField/>);
+<#if indentContent>  </#if>    for(int curItem = 0; curItem < itemCount; curItem++) {
+<#if indentContent>  </#if>      ${helper.getLanguageTypeNameForTypeReference(arrayField.type)}* _value = (${helper.getLanguageTypeNameForTypeReference(arrayField.type)}*) plc4c_utils_list_get_value(_message-><@fieldName baseType=baseType field=arrayField/>, curItem);
+            <#if helper.isSimpleTypeReference(arrayField.type)>
+<#if indentContent>  </#if>      ${helper.getWriteBufferWriteMethodCall(arrayField.type, "*_value")};
+            <#else>
+<#if indentContent>  </#if>      plc4c_return_code _res = plc4c_${helper.getCTypeName(arrayField.type.name)}_serialize(buf, (void*) &_value);
+<#if indentContent>  </#if>      if(_res != OK) {
+<#if indentContent>  </#if>        return _res;
+<#if indentContent>  </#if>      }
+            </#if>
+<#if indentContent>  </#if>    }
+<#if indentContent>  </#if>  }
+            <#break>
+        <#--case "checksum">
+            <#assign checksumField = field>
+            <#assign simpleTypeReference = checksumField.type>
+
+<#if indentContent>  </#if>  // Checksum Field (${checksumField.name})
+<#if indentContent>  </#if>  {
+<#if indentContent>  </#if>    // Create an array of all the bytes read in this message element so far.
+<#if indentContent>  </#if>    byte[] checksumRawData = plc4c_spi_read_get_bytes(buf, startPos, plc4c_spi_read_get_pos(buf));
+<#if indentContent>  </#if>    ${helper.getLanguageTypeNameForField(field)} _checksumRef = ${helper.getReadBufferReadMethodCall(checksumField.type)};
+<#if indentContent>  </#if>    ${helper.getLanguageTypeNameForField(field)} _checksum = (${helper.getLanguageTypeNameForField(field)}) (${helper.toParseExpression(baseType, checksumField, checksumField.checksumExpression, type.parserArguments)});
+<#if indentContent>  </#if>    if(_checksum != _checksumRef) {
+<#if indentContent>  </#if>      return PARSE_ERROR;
+<#if indentContent>  </#if>      // throw new ParseException(String.format("Checksum verification failed. Expected %04X but got %04X",_checksumRef & 0xFFFF, _checksum & 0xFFFF));
+<#if indentContent>  </#if>    }
+<#if indentContent>  </#if>  }
+            <#break-->
+        <#case "const">
+            <#assign constField = field>
+            <#assign simpleTypeReference = constField.type>
+
+<#if indentContent>  </#if>  // Const Field (${constField.name})
+<#if indentContent>  </#if>  ${helper.getWriteBufferWriteMethodCall(constField.type, helper.getCTypeName(baseType.name)?upper_case + "_" + helper.camelCaseToSnakeCase(constField.name)?upper_case)};
+            <#break>
+        <#case "discriminator">
+            <#assign discriminatorField = field>
+            <#assign simpleTypeReference = discriminatorField.type>
+
+<#if indentContent>  </#if>  // Discriminator Field (${discriminatorField.name})
+<#if indentContent>  </#if>  ${helper.getWriteBufferWriteMethodCall(discriminatorField.type, "plc4c_" + helper.getCTypeName(baseType.name) + "_get_discriminator(_message->_type)." + discriminatorField.name)};
+            <#break>
+        <#case "enum">
+            <#assign enumField = field>
+
+<#if indentContent>  </#if>  // Enum field (${enumField.name})
+<#if indentContent>  </#if>  ${helper.getWriteBufferWriteMethodCall(helper.getEnumBaseTypeReference(enumField.type), "_message->" + helper.camelCaseToSnakeCase(enumField.name))};
+            <#break>
+        <#--case "implicit">
+            <#assign implicitField = field>
+            <#assign simpleTypeReference = implicitField.type>
+
+<#if indentContent>  </#if>  // Implicit Field (${implicitField.name}) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+<#if indentContent>  </#if>  ${helper.getLanguageTypeNameForField(field)} ${implicitField.name} = ${helper.getReadBufferReadMethodCall(implicitField.type)};
+            <#break>
+        <#case "manualArray">
+            <#assign manualArrayField = field>
+
+            <- TODO: Implement ->
+            <#break-->
+        <#case "manual">
+            <#assign manualField = field>
+
+<#if indentContent>  </#if>  // Manual Field (${manualField.name})
+<#if indentContent>  </#if>  {
+<#if indentContent>  </#if>    ${helper.getLanguageTypeNameForTypeReference(manualField.type)}* _value = (${helper.getLanguageTypeNameForTypeReference(arrayField.type)}*) plc4c_utils_list_get_value(_message-><@fieldName baseType=baseType field=arrayField/>, curItem);
+            <#if helper.isSimpleTypeReference(manualField.type)>
+<#if indentContent>  </#if>    ${helper.getWriteBufferWriteMethodCall(manualField.type, "*_value")};
+            <#else>
+<#if indentContent>  </#if>    plc4c_return_code _res = plc4c_${helper.getCTypeName(manualField.type.name)}_serialize(buf, (void*) &_value);
+<#if indentContent>  </#if>    if(_res != OK) {
+<#if indentContent>  </#if>      return _res;
+<#if indentContent>  </#if>    }
+            </#if>
+<#if indentContent>  </#if>  }
+            <#break>
+        <#case "optional">
+            <#assign optionalField = field>
+
+<#if indentContent>  </#if>  // Optional Field (${optionalField.name})
+<#if indentContent>  </#if>  if(_message-><@fieldName baseType=baseType field=optionalField/> != NULL) {
+<#if indentContent>  </#if>    ${helper.getLanguageTypeNameForTypeReference(optionalField.type)}* _value = (${helper.getLanguageTypeNameForTypeReference(optionalField.type)}*) _message-><@fieldName baseType=baseType field=optionalField/>;
+            <#if helper.isSimpleTypeReference(optionalField.type)>
+<#if indentContent>  </#if>    ${helper.getWriteBufferWriteMethodCall(optionalField.type, "*_value")};
+            <#else>
+<#if indentContent>  </#if>    plc4c_return_code _res = plc4c_${helper.getCTypeName(optionalField.type.name)}_serialize(buf, (void*) &_value);
+<#if indentContent>  </#if>    if(_res != OK) {
+<#if indentContent>  </#if>      return _res;
+<#if indentContent>  </#if>    }
+            </#if>
+<#if indentContent>  </#if>  }
+            <#break>
+        <#--case "padding">
+            <#assign paddingField = field>
+            <#assign simpleTypeReference = paddingField.type>
+
+<#if indentContent>  </#if>  // Padding Field (padding)
+<#if indentContent>  </#if>  {
+<#if indentContent>  </#if>    bool _needsPadding = (bool) ((plc4c_spi_read_has_more(buf, ${helper.getNumBits(paddingField.type)})) && (${helper.toParseExpression(baseType, paddingField, paddingField.paddingCondition, type.parserArguments)}));
+<#if indentContent>  </#if>    if(_needsPadding) {
+<#if indentContent>  </#if>      // Just read the padding data and ignore it
+<#if indentContent>  </#if>      ${helper.getReadBufferReadMethodCall(paddingField.type)};
+<#if indentContent>  </#if>    }
+<#if indentContent>  </#if>  }
+            <#break>
+        <#case "reserved">
+            <#assign reservedField = field>
+            <#assign simpleTypeReference = reservedField.type>
+
+<#if indentContent>  </#if>  // Reserved Field (Compartmentalized so the "reserved" variable can't leak)
+<#if indentContent>  </#if>  {
+<#if indentContent>  </#if>    ${helper.getLanguageTypeNameForField(field)} _reserved = ${helper.getReadBufferReadMethodCall(reservedField.type)};
+<#if indentContent>  </#if>    if(_reserved != ${reservedField.referenceValue}) {
+<#if indentContent>  </#if>      printf("Expected constant value '%d' but got '%d' for reserved field.", ${reservedField.referenceValue}, _reserved);
+<#if indentContent>  </#if>    }
+<#if indentContent>  </#if>  }
+            <#break>
+        <#case "simple">
+            <#assign simpleField = field>
+
+<#if indentContent>  </#if>  // Simple Field (${simpleField.name})
+            <#if helper.isSimpleTypeReference(simpleField.type)>
+<#if indentContent>  </#if>  ${helper.getLanguageTypeNameForField(field)} ${simpleField.name} = ${helper.getReadBufferReadMethodCall(simpleField.type)};
+            <#else>
+<#if indentContent>  </#if>  ${helper.getLanguageTypeNameForField(field)}* ${simpleField.name};
+<#if indentContent>  </#if>  plc4c_return_code _res = plc4c_${helper.getCTypeName(simpleField.type.name)}_parse(buf<#if simpleField.params?has_content>, <#list simpleField.params as parserTerm>${helper.toParseExpression(baseType, simpleField, parserTerm, type.parserArguments)}<#sep>, </#sep></#list></#if>, (void*) &${simpleField.name});
+<#if indentContent>  </#if>  if(_res != OK) {
+<#if indentContent>  </#if>    return _res;
+<#if indentContent>  </#if>  }
+            </#if>
+<#if indentContent>  </#if>  (*_message)-><@fieldName baseType=baseType field=simpleField/> = ${simpleField.name};
+            <#break>
+        <#case "switch">
+            <#assign switchField = field>
+
+<#if indentContent>  </#if>  // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
+            <#list switchField.cases as case>
+<#if indentContent>  </#if>  <#if case.discriminatorValues?has_content>if(<#list case.discriminatorValues as discriminatorValue><#if case.discriminatorValues?size &gt; 1>(</#if>${helper.toVariableParseExpression(baseType, switchField, switchField.discriminatorExpressions[discriminatorValue?index], type.parserArguments)} == ${discriminatorValue}<#if case.discriminatorValues?size &gt; 1>)</#if><#sep> && </#sep></#list>) </#if>{ /* ${case.name} */
+                <#list case.fields as caseField>
+<#if indentContent>  </#if>                    <@fieldParser baseType=case field=caseField indentContent=true/>
+                        <#sep >
+
+                </#list>
+<#if indentContent>  </#if>  }<#sep> else </#sep>
+            </#list>
+            <#break>
+        <#case "virtual">
+            <#assign virtualField = field>
+
+<#if indentContent>  </#if>  // Virtual field (Just declare a local variable so we can access it in the parser)
+<#if indentContent>  </#if>  ${helper.getLanguageTypeNameForField(field)} ${virtualField.name} = (${helper.getLanguageTypeNameForField(field)}) (${helper.toParseExpression(baseType, virtualField, virtualField.valueExpression, type.parserArguments)});
+            <#break-->
+    </#switch>
+</#macro>
+<#list type.fields as field>
+  <@fieldSerializer baseType=type field=field indentContent=false/>
+</#list>
+
   return OK;
 }
 </#if>
diff --git a/build-utils/language-java/src/main/java/org/apache/plc4x/language/java/JavaLanguageTemplateHelper.java b/build-utils/language-java/src/main/java/org/apache/plc4x/language/java/JavaLanguageTemplateHelper.java
index 5a3d58b..dce14cf 100644
--- a/build-utils/language-java/src/main/java/org/apache/plc4x/language/java/JavaLanguageTemplateHelper.java
+++ b/build-utils/language-java/src/main/java/org/apache/plc4x/language/java/JavaLanguageTemplateHelper.java
@@ -293,7 +293,7 @@ public class JavaLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHe
     }
 
     @Override
-    public String getWriteBufferReadMethodCall(SimpleTypeReference simpleTypeReference, String fieldName) {
+    public String getWriteBufferWriteMethodCall(SimpleTypeReference simpleTypeReference, String fieldName) {
         switch (simpleTypeReference.getBaseType()) {
             case BIT: {
                 return "io.writeBit((boolean) " + fieldName + ")";
diff --git a/build-utils/language-java/src/main/resources/templates/java/data-io-template.ftlh b/build-utils/language-java/src/main/resources/templates/java/data-io-template.ftlh
index 7148dee..fbb9571 100644
--- a/build-utils/language-java/src/main/resources/templates/java/data-io-template.ftlh
+++ b/build-utils/language-java/src/main/resources/templates/java/data-io-template.ftlh
@@ -258,12 +258,12 @@ public class ${type.name}IO {
                     <#break>
                     <#case "const">
             // Const Field (${field.name})
-            ${helper.getWriteBufferReadMethodCall(field.type, field.referenceValue)};
+            ${helper.getWriteBufferWriteMethodCall(field.type, field.referenceValue)};
                     <#break>
                     <#case "enum">
             // Enum field (${field.name})
             ${helper.getLanguageTypeNameForField(field)} ${field.name} = (${helper.getLanguageTypeNameForField(field)}) _value.get${field.name?cap_first}();
-            ${helper.getWriteBufferReadMethodCall(helper.getEnumBaseTypeReference(field.type), "(" + field.name + ".getValue())")};
+            ${helper.getWriteBufferWriteMethodCall(helper.getEnumBaseTypeReference(field.type), "(" + field.name + ".getValue())")};
                     <#break>
                     <#case "manual">
             // Manual Field (${field.name})
@@ -271,7 +271,7 @@ public class ${type.name}IO {
                     <#break>
                     <#case "reserved">
             // Reserved Field
-            ${helper.getWriteBufferReadMethodCall(field.type, helper.getReservedValue(field))};
+            ${helper.getWriteBufferWriteMethodCall(field.type, helper.getReservedValue(field))};
                     <#break>
                     <#case "simple">
             // Simple Field (${field.name})
@@ -286,7 +286,7 @@ public class ${type.name}IO {
                             </#if>
                         </#if>
                         <#if helper.isSimpleTypeReference(field.type)>
-            ${helper.getWriteBufferReadMethodCall(field.type, "(" + field.name + ")")};
+            ${helper.getWriteBufferWriteMethodCall(field.type, "(" + field.name + ")")};
                         <#else>
             ${field.type.name}IO.staticSerialize(io, ${field.name});
                         </#if>
diff --git a/build-utils/language-java/src/main/resources/templates/java/io-template.ftlh b/build-utils/language-java/src/main/resources/templates/java/io-template.ftlh
index 9fc2a4d..2098fad 100644
--- a/build-utils/language-java/src/main/resources/templates/java/io-template.ftlh
+++ b/build-utils/language-java/src/main/resources/templates/java/io-template.ftlh
@@ -414,7 +414,7 @@ public class ${type.name}IO implements <#if outputFlavor != "passive">MessageIO<
             for(${helper.getLanguageTypeNameForField(field)} element : _value.get${arrayField.name?cap_first}()) {
                 <#if helper.isSimpleTypeReference(arrayField.type)>
                     <#assign simpleTypeReference = arrayField.type>
-                ${helper.getWriteBufferReadMethodCall(simpleTypeReference, "element")};
+                ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, "element")};
                 <#else>
                     <#assign complexTypeReference = arrayField.type>
                 boolean lastItem = curItem == (itemCount - 1);
@@ -434,7 +434,7 @@ public class ${type.name}IO implements <#if outputFlavor != "passive">MessageIO<
             // Create an array of all the bytes written in this message element so far.
             byte[] checksumRawData = io.getBytes(startPos, io.getPos());
             _checksum = (${helper.getLanguageTypeNameForField(field)}) (${helper.toSerializationExpression(checksumField, checksumField.checksumExpression, type.parserArguments)});
-            ${helper.getWriteBufferReadMethodCall(simpleTypeReference, "(_checksum)")};
+            ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, "(_checksum)")};
         }
         <#break>
     <#case "const">
@@ -442,7 +442,7 @@ public class ${type.name}IO implements <#if outputFlavor != "passive">MessageIO<
         <#assign simpleTypeReference = constField.type>
 
         // Const Field (${constField.name})
-        ${helper.getWriteBufferReadMethodCall(simpleTypeReference, constField.referenceValue)};
+        ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, constField.referenceValue)};
         <#break>
     <#case "discriminator">
         <#assign discriminatorField = field>
@@ -450,14 +450,14 @@ public class ${type.name}IO implements <#if outputFlavor != "passive">MessageIO<
 
         // Discriminator Field (${discriminatorField.name}) (Used as input to a switch field)
         ${helper.getLanguageTypeNameForField(field)} ${discriminatorField.name} = (${helper.getLanguageTypeNameForField(field)}) _value.get${discriminatorField.name?cap_first}();
-        ${helper.getWriteBufferReadMethodCall(simpleTypeReference, "(" + discriminatorField.name + ")")};
+        ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, "(" + discriminatorField.name + ")")};
         <#break>
     <#case "enum">
         <#assign enumField = field>
 
         // Enum field (${enumField.name})
         ${helper.getLanguageTypeNameForField(field)} ${enumField.name} = (${helper.getLanguageTypeNameForField(field)}) _value.get${enumField.name?cap_first}();
-        ${helper.getWriteBufferReadMethodCall(helper.getEnumBaseTypeReference(enumField.type), "(" + enumField.name + ".getValue())")};
+        ${helper.getWriteBufferWriteMethodCall(helper.getEnumBaseTypeReference(enumField.type), "(" + enumField.name + ".getValue())")};
         <#break>
     <#case "implicit">
         <#assign implicitField = field>
@@ -465,7 +465,7 @@ public class ${type.name}IO implements <#if outputFlavor != "passive">MessageIO<
 
         // Implicit Field (${implicitField.name}) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
         ${helper.getLanguageTypeNameForField(field)} ${implicitField.name} = (${helper.getLanguageTypeNameForField(field)}) (${helper.toSerializationExpression(implicitField, implicitField.serializeExpression, type.parserArguments)});
-        ${helper.getWriteBufferReadMethodCall(simpleTypeReference, "(" + implicitField.name + ")")};
+        ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, "(" + implicitField.name + ")")};
         <#break>
     <#case "manualArray">
         <#assign manualArrayField = field>
@@ -492,7 +492,7 @@ public class ${type.name}IO implements <#if outputFlavor != "passive">MessageIO<
             ${optionalField.name} = (${helper.getLanguageTypeNameForField(field)}) _value.get${optionalField.name?cap_first}();
             <#if helper.isSimpleTypeReference(optionalField.type)>
                 <#assign simpleTypeReference = optionalField.type>
-            ${helper.getWriteBufferReadMethodCall(simpleTypeReference, "(" + optionalField.name + ")")};
+            ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, "(" + optionalField.name + ")")};
             <#else>
                 <#assign complexTypeReference = optionalField.type>
             ${complexTypeReference.name}IO.staticSerialize(io, ${optionalField.name});
@@ -508,7 +508,7 @@ public class ${type.name}IO implements <#if outputFlavor != "passive">MessageIO<
             boolean _needsPadding = (boolean) (${helper.toSerializationExpression(paddingField, paddingField.paddingCondition, type.parserArguments)});
             if(_needsPadding) {
                 ${helper.getLanguageTypeNameForField(field)} _paddingValue = (${helper.getLanguageTypeNameForField(field)}) (${helper.toSerializationExpression(paddingField, paddingField.paddingValue, type.parserArguments)});
-                ${helper.getWriteBufferReadMethodCall(simpleTypeReference, "(_paddingValue)")};
+                ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, "(_paddingValue)")};
             }
         }
         <#break>
@@ -517,7 +517,7 @@ public class ${type.name}IO implements <#if outputFlavor != "passive">MessageIO<
         <#assign simpleTypeReference = reservedField.type>
 
         // Reserved Field (reserved)
-        ${helper.getWriteBufferReadMethodCall(simpleTypeReference, helper.getReservedValue(field))};
+        ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, helper.getReservedValue(field))};
         <#break>
     <#case "simple">
         <#assign simpleField = field>
@@ -526,7 +526,7 @@ public class ${type.name}IO implements <#if outputFlavor != "passive">MessageIO<
         ${helper.getLanguageTypeNameForField(field)} ${simpleField.name} = (${helper.getLanguageTypeNameForField(field)}) _value.get${simpleField.name?cap_first}();
         <#if helper.isSimpleTypeReference(simpleField.type)>
             <#assign simpleTypeReference = simpleField.type>
-            ${helper.getWriteBufferReadMethodCall(simpleTypeReference, "(" + simpleField.name + ")")};
+            ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, "(" + simpleField.name + ")")};
         <#else>
             <#assign complexTypeReference = simpleField.type>
         ${complexTypeReference.name}IO.staticSerialize(io, ${simpleField.name});
diff --git a/sandbox/plc4c/api/include/plc4c/utils/list.h b/sandbox/plc4c/api/include/plc4c/utils/list.h
index 2d0724c..013097c 100644
--- a/sandbox/plc4c/api/include/plc4c/utils/list.h
+++ b/sandbox/plc4c/api/include/plc4c/utils/list.h
@@ -51,6 +51,8 @@ bool plc4c_utils_list_contains(plc4c_list *list, plc4c_list_element *element);
 
 bool plc4c_utils_list_get(plc4c_list *list, size_t element_index);
 
+void* plc4c_utils_list_get_value(plc4c_list *list, size_t element_index);
+
 void plc4c_utils_list_insert_head(plc4c_list *list,
                                   plc4c_list_element *element);
 
diff --git a/sandbox/plc4c/generated-sources/modbus/src/modbus_constants.c b/sandbox/plc4c/generated-sources/modbus/src/modbus_constants.c
index 15b15f0..3112267 100644
--- a/sandbox/plc4c/generated-sources/modbus/src/modbus_constants.c
+++ b/sandbox/plc4c/generated-sources/modbus/src/modbus_constants.c
@@ -44,6 +44,10 @@ plc4c_return_code plc4c_modbus_read_write_modbus_constants_parse(plc4c_spi_read_
   return OK;
 }
 
-plc4c_return_code plc4c_modbus_read_write_modbus_constants_serialize(plc4c_spi_write_buffer* buf, plc4c_modbus_read_write_modbus_constants* message) {
+plc4c_return_code plc4c_modbus_read_write_modbus_constants_serialize(plc4c_spi_write_buffer* buf, plc4c_modbus_read_write_modbus_constants* _message) {
+
+  // Const Field (modbusTcpDefaultPort)
+  plc4c_spi_write_unsigned_int(buf, 16, MODBUS_READ_WRITE_MODBUS_CONSTANTS_MODBUS_TCP_DEFAULT_PORT);
+
   return OK;
 }
diff --git a/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu.c b/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu.c
index 81b3be3..97b0b06 100644
--- a/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu.c
+++ b/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu.c
@@ -798,6 +798,13 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_parse(plc4c_spi_read_buffer
   return OK;
 }
 
-plc4c_return_code plc4c_modbus_read_write_modbus_pdu_serialize(plc4c_spi_write_buffer* buf, plc4c_modbus_read_write_modbus_pdu* message) {
+plc4c_return_code plc4c_modbus_read_write_modbus_pdu_serialize(plc4c_spi_write_buffer* buf, plc4c_modbus_read_write_modbus_pdu* _message) {
+
+  // Discriminator Field (error)
+  plc4c_spi_write_bit(buf, plc4c_modbus_read_write_modbus_pdu_get_discriminator(_message->_type).error);
+
+  // Discriminator Field (function)
+  plc4c_spi_write_unsigned_short(buf, 7, plc4c_modbus_read_write_modbus_pdu_get_discriminator(_message->_type).function);
+
   return OK;
 }
diff --git a/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu_read_file_record_request_item.c b/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu_read_file_record_request_item.c
index 31e6b67..913c0cb 100644
--- a/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu_read_file_record_request_item.c
+++ b/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu_read_file_record_request_item.c
@@ -54,6 +54,7 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_read_file_record_request_it
   return OK;
 }
 
-plc4c_return_code plc4c_modbus_read_write_modbus_pdu_read_file_record_request_item_serialize(plc4c_spi_write_buffer* buf, plc4c_modbus_read_write_modbus_pdu_read_file_record_request_item* message) {
+plc4c_return_code plc4c_modbus_read_write_modbus_pdu_read_file_record_request_item_serialize(plc4c_spi_write_buffer* buf, plc4c_modbus_read_write_modbus_pdu_read_file_record_request_item* _message) {
+
   return OK;
 }
diff --git a/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu_read_file_record_response_item.c b/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu_read_file_record_response_item.c
index 686c4d3..d821804 100644
--- a/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu_read_file_record_response_item.c
+++ b/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu_read_file_record_response_item.c
@@ -61,6 +61,16 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_read_file_record_response_i
   return OK;
 }
 
-plc4c_return_code plc4c_modbus_read_write_modbus_pdu_read_file_record_response_item_serialize(plc4c_spi_write_buffer* buf, plc4c_modbus_read_write_modbus_pdu_read_file_record_response_item* message) {
+plc4c_return_code plc4c_modbus_read_write_modbus_pdu_read_file_record_response_item_serialize(plc4c_spi_write_buffer* buf, plc4c_modbus_read_write_modbus_pdu_read_file_record_response_item* _message) {
+
+  // Array field (data)
+  {
+    uint8_t itemCount = plc4c_utils_list_size(_message->data);
+    for(int curItem = 0; curItem < itemCount; curItem++) {
+      uint16_t* _value = (uint16_t*) plc4c_utils_list_get_value(_message->data, curItem);
+      plc4c_spi_write_unsigned_int(buf, 16, *_value);
+    }
+  }
+
   return OK;
 }
diff --git a/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu_write_file_record_request_item.c b/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu_write_file_record_request_item.c
index 33b8e9a..6f49b0e 100644
--- a/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu_write_file_record_request_item.c
+++ b/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu_write_file_record_request_item.c
@@ -69,6 +69,16 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_write_file_record_request_i
   return OK;
 }
 
-plc4c_return_code plc4c_modbus_read_write_modbus_pdu_write_file_record_request_item_serialize(plc4c_spi_write_buffer* buf, plc4c_modbus_read_write_modbus_pdu_write_file_record_request_item* message) {
+plc4c_return_code plc4c_modbus_read_write_modbus_pdu_write_file_record_request_item_serialize(plc4c_spi_write_buffer* buf, plc4c_modbus_read_write_modbus_pdu_write_file_record_request_item* _message) {
+
+  // Array field (recordData)
+  {
+    uint8_t itemCount = plc4c_utils_list_size(_message->record_data);
+    for(int curItem = 0; curItem < itemCount; curItem++) {
+      uint16_t* _value = (uint16_t*) plc4c_utils_list_get_value(_message->record_data, curItem);
+      plc4c_spi_write_unsigned_int(buf, 16, *_value);
+    }
+  }
+
   return OK;
 }
diff --git a/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu_write_file_record_response_item.c b/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu_write_file_record_response_item.c
index 21f3113..a41c330 100644
--- a/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu_write_file_record_response_item.c
+++ b/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu_write_file_record_response_item.c
@@ -69,6 +69,16 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_write_file_record_response_
   return OK;
 }
 
-plc4c_return_code plc4c_modbus_read_write_modbus_pdu_write_file_record_response_item_serialize(plc4c_spi_write_buffer* buf, plc4c_modbus_read_write_modbus_pdu_write_file_record_response_item* message) {
+plc4c_return_code plc4c_modbus_read_write_modbus_pdu_write_file_record_response_item_serialize(plc4c_spi_write_buffer* buf, plc4c_modbus_read_write_modbus_pdu_write_file_record_response_item* _message) {
+
+  // Array field (recordData)
+  {
+    uint8_t itemCount = plc4c_utils_list_size(_message->record_data);
+    for(int curItem = 0; curItem < itemCount; curItem++) {
+      uint16_t* _value = (uint16_t*) plc4c_utils_list_get_value(_message->record_data, curItem);
+      plc4c_spi_write_unsigned_int(buf, 16, *_value);
+    }
+  }
+
   return OK;
 }
diff --git a/sandbox/plc4c/generated-sources/modbus/src/modbus_serial_adu.c b/sandbox/plc4c/generated-sources/modbus/src/modbus_serial_adu.c
index c284a6d..08dcaaa 100644
--- a/sandbox/plc4c/generated-sources/modbus/src/modbus_serial_adu.c
+++ b/sandbox/plc4c/generated-sources/modbus/src/modbus_serial_adu.c
@@ -66,6 +66,7 @@ plc4c_return_code plc4c_modbus_read_write_modbus_serial_adu_parse(plc4c_spi_read
   return OK;
 }
 
-plc4c_return_code plc4c_modbus_read_write_modbus_serial_adu_serialize(plc4c_spi_write_buffer* buf, plc4c_modbus_read_write_modbus_serial_adu* message) {
+plc4c_return_code plc4c_modbus_read_write_modbus_serial_adu_serialize(plc4c_spi_write_buffer* buf, plc4c_modbus_read_write_modbus_serial_adu* _message) {
+
   return OK;
 }
diff --git a/sandbox/plc4c/generated-sources/modbus/src/modbus_tcp_adu.c b/sandbox/plc4c/generated-sources/modbus/src/modbus_tcp_adu.c
index 96d17ab..a22948b 100644
--- a/sandbox/plc4c/generated-sources/modbus/src/modbus_tcp_adu.c
+++ b/sandbox/plc4c/generated-sources/modbus/src/modbus_tcp_adu.c
@@ -64,6 +64,10 @@ plc4c_return_code plc4c_modbus_read_write_modbus_tcp_adu_parse(plc4c_spi_read_bu
   return OK;
 }
 
-plc4c_return_code plc4c_modbus_read_write_modbus_tcp_adu_serialize(plc4c_spi_write_buffer* buf, plc4c_modbus_read_write_modbus_tcp_adu* message) {
+plc4c_return_code plc4c_modbus_read_write_modbus_tcp_adu_serialize(plc4c_spi_write_buffer* buf, plc4c_modbus_read_write_modbus_tcp_adu* _message) {
+
+  // Const Field (protocolIdentifier)
+  plc4c_spi_write_unsigned_int(buf, 16, MODBUS_READ_WRITE_MODBUS_TCP_ADU_PROTOCOL_IDENTIFIER);
+
   return OK;
 }
diff --git a/sandbox/plc4c/generated-sources/s7/src/cotp_packet.c b/sandbox/plc4c/generated-sources/s7/src/cotp_packet.c
index 110facd..d71ec5e 100644
--- a/sandbox/plc4c/generated-sources/s7/src/cotp_packet.c
+++ b/sandbox/plc4c/generated-sources/s7/src/cotp_packet.c
@@ -202,6 +202,31 @@ plc4c_return_code plc4c_s7_read_write_cotp_packet_parse(plc4c_spi_read_buffer* b
   return OK;
 }
 
-plc4c_return_code plc4c_s7_read_write_cotp_packet_serialize(plc4c_spi_write_buffer* buf, plc4c_s7_read_write_cotp_packet* message) {
+plc4c_return_code plc4c_s7_read_write_cotp_packet_serialize(plc4c_spi_write_buffer* buf, plc4c_s7_read_write_cotp_packet* _message) {
+
+  // Discriminator Field (tpduCode)
+  plc4c_spi_write_unsigned_short(buf, 8, plc4c_s7_read_write_cotp_packet_get_discriminator(_message->_type).tpduCode);
+
+  // Array field (parameters)
+  {
+    uint8_t itemCount = plc4c_utils_list_size(_message->parameters);
+    for(int curItem = 0; curItem < itemCount; curItem++) {
+      plc4c_s7_read_write_cotp_parameter* _value = (plc4c_s7_read_write_cotp_parameter*) plc4c_utils_list_get_value(_message->parameters, curItem);
+      plc4c_return_code _res = plc4c_s7_read_write_cotp_parameter_serialize(buf, (void*) &_value);
+      if(_res != OK) {
+        return _res;
+      }
+    }
+  }
+
+  // Optional Field (payload)
+  if(_message->payload != NULL) {
+    plc4c_s7_read_write_s7_message* _value = (plc4c_s7_read_write_s7_message*) _message->payload;
+    plc4c_return_code _res = plc4c_s7_read_write_s7_message_serialize(buf, (void*) &_value);
+    if(_res != OK) {
+      return _res;
+    }
+  }
+
   return OK;
 }
diff --git a/sandbox/plc4c/generated-sources/s7/src/cotp_parameter.c b/sandbox/plc4c/generated-sources/s7/src/cotp_parameter.c
index 92b7411..d565a67 100644
--- a/sandbox/plc4c/generated-sources/s7/src/cotp_parameter.c
+++ b/sandbox/plc4c/generated-sources/s7/src/cotp_parameter.c
@@ -114,6 +114,10 @@ plc4c_return_code plc4c_s7_read_write_cotp_parameter_parse(plc4c_spi_read_buffer
   return OK;
 }
 
-plc4c_return_code plc4c_s7_read_write_cotp_parameter_serialize(plc4c_spi_write_buffer* buf, plc4c_s7_read_write_cotp_parameter* message) {
+plc4c_return_code plc4c_s7_read_write_cotp_parameter_serialize(plc4c_spi_write_buffer* buf, plc4c_s7_read_write_cotp_parameter* _message) {
+
+  // Discriminator Field (parameterType)
+  plc4c_spi_write_unsigned_short(buf, 8, plc4c_s7_read_write_cotp_parameter_get_discriminator(_message->_type).parameterType);
+
   return OK;
 }
diff --git a/sandbox/plc4c/generated-sources/s7/src/s7_address.c b/sandbox/plc4c/generated-sources/s7/src/s7_address.c
index 1d9659a..b60d64b 100644
--- a/sandbox/plc4c/generated-sources/s7/src/s7_address.c
+++ b/sandbox/plc4c/generated-sources/s7/src/s7_address.c
@@ -102,6 +102,10 @@ plc4c_return_code plc4c_s7_read_write_s7_address_parse(plc4c_spi_read_buffer* bu
   return OK;
 }
 
-plc4c_return_code plc4c_s7_read_write_s7_address_serialize(plc4c_spi_write_buffer* buf, plc4c_s7_read_write_s7_address* message) {
+plc4c_return_code plc4c_s7_read_write_s7_address_serialize(plc4c_spi_write_buffer* buf, plc4c_s7_read_write_s7_address* _message) {
+
+  // Discriminator Field (addressType)
+  plc4c_spi_write_unsigned_short(buf, 8, plc4c_s7_read_write_s7_address_get_discriminator(_message->_type).addressType);
+
   return OK;
 }
diff --git a/sandbox/plc4c/generated-sources/s7/src/s7_message.c b/sandbox/plc4c/generated-sources/s7/src/s7_message.c
index ec32324..d837ef0 100644
--- a/sandbox/plc4c/generated-sources/s7/src/s7_message.c
+++ b/sandbox/plc4c/generated-sources/s7/src/s7_message.c
@@ -145,6 +145,31 @@ plc4c_return_code plc4c_s7_read_write_s7_message_parse(plc4c_spi_read_buffer* bu
   return OK;
 }
 
-plc4c_return_code plc4c_s7_read_write_s7_message_serialize(plc4c_spi_write_buffer* buf, plc4c_s7_read_write_s7_message* message) {
+plc4c_return_code plc4c_s7_read_write_s7_message_serialize(plc4c_spi_write_buffer* buf, plc4c_s7_read_write_s7_message* _message) {
+
+  // Const Field (protocolId)
+  plc4c_spi_write_unsigned_short(buf, 8, S7_READ_WRITE_S7_MESSAGE_PROTOCOL_ID);
+
+  // Discriminator Field (messageType)
+  plc4c_spi_write_unsigned_short(buf, 8, plc4c_s7_read_write_s7_message_get_discriminator(_message->_type).messageType);
+
+  // Optional Field (parameter)
+  if(_message->parameter != NULL) {
+    plc4c_s7_read_write_s7_parameter* _value = (plc4c_s7_read_write_s7_parameter*) _message->parameter;
+    plc4c_return_code _res = plc4c_s7_read_write_s7_parameter_serialize(buf, (void*) &_value);
+    if(_res != OK) {
+      return _res;
+    }
+  }
+
+  // Optional Field (payload)
+  if(_message->payload != NULL) {
+    plc4c_s7_read_write_s7_payload* _value = (plc4c_s7_read_write_s7_payload*) _message->payload;
+    plc4c_return_code _res = plc4c_s7_read_write_s7_payload_serialize(buf, (void*) &_value);
+    if(_res != OK) {
+      return _res;
+    }
+  }
+
   return OK;
 }
diff --git a/sandbox/plc4c/generated-sources/s7/src/s7_parameter.c b/sandbox/plc4c/generated-sources/s7/src/s7_parameter.c
index 72c1b75..eb6ef05 100644
--- a/sandbox/plc4c/generated-sources/s7/src/s7_parameter.c
+++ b/sandbox/plc4c/generated-sources/s7/src/s7_parameter.c
@@ -192,6 +192,10 @@ plc4c_return_code plc4c_s7_read_write_s7_parameter_parse(plc4c_spi_read_buffer*
   return OK;
 }
 
-plc4c_return_code plc4c_s7_read_write_s7_parameter_serialize(plc4c_spi_write_buffer* buf, plc4c_s7_read_write_s7_parameter* message) {
+plc4c_return_code plc4c_s7_read_write_s7_parameter_serialize(plc4c_spi_write_buffer* buf, plc4c_s7_read_write_s7_parameter* _message) {
+
+  // Discriminator Field (parameterType)
+  plc4c_spi_write_unsigned_short(buf, 8, plc4c_s7_read_write_s7_parameter_get_discriminator(_message->_type).parameterType);
+
   return OK;
 }
diff --git a/sandbox/plc4c/generated-sources/s7/src/s7_parameter_user_data_item.c b/sandbox/plc4c/generated-sources/s7/src/s7_parameter_user_data_item.c
index 360b806..649c8ba 100644
--- a/sandbox/plc4c/generated-sources/s7/src/s7_parameter_user_data_item.c
+++ b/sandbox/plc4c/generated-sources/s7/src/s7_parameter_user_data_item.c
@@ -130,6 +130,10 @@ plc4c_return_code plc4c_s7_read_write_s7_parameter_user_data_item_parse(plc4c_sp
   return OK;
 }
 
-plc4c_return_code plc4c_s7_read_write_s7_parameter_user_data_item_serialize(plc4c_spi_write_buffer* buf, plc4c_s7_read_write_s7_parameter_user_data_item* message) {
+plc4c_return_code plc4c_s7_read_write_s7_parameter_user_data_item_serialize(plc4c_spi_write_buffer* buf, plc4c_s7_read_write_s7_parameter_user_data_item* _message) {
+
+  // Discriminator Field (itemType)
+  plc4c_spi_write_unsigned_short(buf, 8, plc4c_s7_read_write_s7_parameter_user_data_item_get_discriminator(_message->_type).itemType);
+
   return OK;
 }
diff --git a/sandbox/plc4c/generated-sources/s7/src/s7_payload.c b/sandbox/plc4c/generated-sources/s7/src/s7_payload.c
index 438f013..bb27e35 100644
--- a/sandbox/plc4c/generated-sources/s7/src/s7_payload.c
+++ b/sandbox/plc4c/generated-sources/s7/src/s7_payload.c
@@ -150,6 +150,7 @@ plc4c_return_code plc4c_s7_read_write_s7_payload_parse(plc4c_spi_read_buffer* bu
   return OK;
 }
 
-plc4c_return_code plc4c_s7_read_write_s7_payload_serialize(plc4c_spi_write_buffer* buf, plc4c_s7_read_write_s7_payload* message) {
+plc4c_return_code plc4c_s7_read_write_s7_payload_serialize(plc4c_spi_write_buffer* buf, plc4c_s7_read_write_s7_payload* _message) {
+
   return OK;
 }
diff --git a/sandbox/plc4c/generated-sources/s7/src/s7_payload_user_data_item.c b/sandbox/plc4c/generated-sources/s7/src/s7_payload_user_data_item.c
index 1644afc..b7d6a0e 100644
--- a/sandbox/plc4c/generated-sources/s7/src/s7_payload_user_data_item.c
+++ b/sandbox/plc4c/generated-sources/s7/src/s7_payload_user_data_item.c
@@ -117,6 +117,13 @@ plc4c_return_code plc4c_s7_read_write_s7_payload_user_data_item_parse(plc4c_spi_
   return OK;
 }
 
-plc4c_return_code plc4c_s7_read_write_s7_payload_user_data_item_serialize(plc4c_spi_write_buffer* buf, plc4c_s7_read_write_s7_payload_user_data_item* message) {
+plc4c_return_code plc4c_s7_read_write_s7_payload_user_data_item_serialize(plc4c_spi_write_buffer* buf, plc4c_s7_read_write_s7_payload_user_data_item* _message) {
+
+  // Enum field (returnCode)
+  plc4c_spi_write_byte(buf, 8, _message->return_code);
+
+  // Enum field (transportSize)
+  plc4c_spi_write_byte(buf, 8, _message->transport_size);
+
   return OK;
 }
diff --git a/sandbox/plc4c/generated-sources/s7/src/s7_var_payload_data_item.c b/sandbox/plc4c/generated-sources/s7/src/s7_var_payload_data_item.c
index 46fe0ba..07ec009 100644
--- a/sandbox/plc4c/generated-sources/s7/src/s7_var_payload_data_item.c
+++ b/sandbox/plc4c/generated-sources/s7/src/s7_var_payload_data_item.c
@@ -76,6 +76,22 @@ plc4c_return_code plc4c_s7_read_write_s7_var_payload_data_item_parse(plc4c_spi_r
   return OK;
 }
 
-plc4c_return_code plc4c_s7_read_write_s7_var_payload_data_item_serialize(plc4c_spi_write_buffer* buf, plc4c_s7_read_write_s7_var_payload_data_item* message) {
+plc4c_return_code plc4c_s7_read_write_s7_var_payload_data_item_serialize(plc4c_spi_write_buffer* buf, plc4c_s7_read_write_s7_var_payload_data_item* _message) {
+
+  // Enum field (returnCode)
+  plc4c_spi_write_byte(buf, 8, _message->return_code);
+
+  // Enum field (transportSize)
+  plc4c_spi_write_byte(buf, 8, _message->transport_size);
+
+  // Array field (data)
+  {
+    uint8_t itemCount = plc4c_utils_list_size(_message->data);
+    for(int curItem = 0; curItem < itemCount; curItem++) {
+      int8_t* _value = (int8_t*) plc4c_utils_list_get_value(_message->data, curItem);
+      plc4c_spi_write_byte(buf, 8, *_value);
+    }
+  }
+
   return OK;
 }
diff --git a/sandbox/plc4c/generated-sources/s7/src/s7_var_payload_status_item.c b/sandbox/plc4c/generated-sources/s7/src/s7_var_payload_status_item.c
index 420006a..099742a 100644
--- a/sandbox/plc4c/generated-sources/s7/src/s7_var_payload_status_item.c
+++ b/sandbox/plc4c/generated-sources/s7/src/s7_var_payload_status_item.c
@@ -42,6 +42,10 @@ plc4c_return_code plc4c_s7_read_write_s7_var_payload_status_item_parse(plc4c_spi
   return OK;
 }
 
-plc4c_return_code plc4c_s7_read_write_s7_var_payload_status_item_serialize(plc4c_spi_write_buffer* buf, plc4c_s7_read_write_s7_var_payload_status_item* message) {
+plc4c_return_code plc4c_s7_read_write_s7_var_payload_status_item_serialize(plc4c_spi_write_buffer* buf, plc4c_s7_read_write_s7_var_payload_status_item* _message) {
+
+  // Enum field (returnCode)
+  plc4c_spi_write_byte(buf, 8, _message->return_code);
+
   return OK;
 }
diff --git a/sandbox/plc4c/generated-sources/s7/src/s7_var_request_parameter_item.c b/sandbox/plc4c/generated-sources/s7/src/s7_var_request_parameter_item.c
index a381720..3d8800f 100644
--- a/sandbox/plc4c/generated-sources/s7/src/s7_var_request_parameter_item.c
+++ b/sandbox/plc4c/generated-sources/s7/src/s7_var_request_parameter_item.c
@@ -71,6 +71,10 @@ plc4c_return_code plc4c_s7_read_write_s7_var_request_parameter_item_parse(plc4c_
   return OK;
 }
 
-plc4c_return_code plc4c_s7_read_write_s7_var_request_parameter_item_serialize(plc4c_spi_write_buffer* buf, plc4c_s7_read_write_s7_var_request_parameter_item* message) {
+plc4c_return_code plc4c_s7_read_write_s7_var_request_parameter_item_serialize(plc4c_spi_write_buffer* buf, plc4c_s7_read_write_s7_var_request_parameter_item* _message) {
+
+  // Discriminator Field (itemType)
+  plc4c_spi_write_unsigned_short(buf, 8, plc4c_s7_read_write_s7_var_request_parameter_item_get_discriminator(_message->_type).itemType);
+
   return OK;
 }
diff --git a/sandbox/plc4c/generated-sources/s7/src/szl_data_tree_item.c b/sandbox/plc4c/generated-sources/s7/src/szl_data_tree_item.c
index 423d163..45471c4 100644
--- a/sandbox/plc4c/generated-sources/s7/src/szl_data_tree_item.c
+++ b/sandbox/plc4c/generated-sources/s7/src/szl_data_tree_item.c
@@ -71,6 +71,16 @@ plc4c_return_code plc4c_s7_read_write_szl_data_tree_item_parse(plc4c_spi_read_bu
   return OK;
 }
 
-plc4c_return_code plc4c_s7_read_write_szl_data_tree_item_serialize(plc4c_spi_write_buffer* buf, plc4c_s7_read_write_szl_data_tree_item* message) {
+plc4c_return_code plc4c_s7_read_write_szl_data_tree_item_serialize(plc4c_spi_write_buffer* buf, plc4c_s7_read_write_szl_data_tree_item* _message) {
+
+  // Array field (mlfb)
+  {
+    uint8_t itemCount = plc4c_utils_list_size(_message->mlfb);
+    for(int curItem = 0; curItem < itemCount; curItem++) {
+      int8_t* _value = (int8_t*) plc4c_utils_list_get_value(_message->mlfb, curItem);
+      plc4c_spi_write_byte(buf, 8, *_value);
+    }
+  }
+
   return OK;
 }
diff --git a/sandbox/plc4c/generated-sources/s7/src/szl_id.c b/sandbox/plc4c/generated-sources/s7/src/szl_id.c
index 532015d..bb1c06d 100644
--- a/sandbox/plc4c/generated-sources/s7/src/szl_id.c
+++ b/sandbox/plc4c/generated-sources/s7/src/szl_id.c
@@ -50,6 +50,13 @@ plc4c_return_code plc4c_s7_read_write_szl_id_parse(plc4c_spi_read_buffer* buf, p
   return OK;
 }
 
-plc4c_return_code plc4c_s7_read_write_szl_id_serialize(plc4c_spi_write_buffer* buf, plc4c_s7_read_write_szl_id* message) {
+plc4c_return_code plc4c_s7_read_write_szl_id_serialize(plc4c_spi_write_buffer* buf, plc4c_s7_read_write_szl_id* _message) {
+
+  // Enum field (typeClass)
+  plc4c_spi_write_byte(buf, 4, _message->type_class);
+
+  // Enum field (sublistList)
+  plc4c_spi_write_byte(buf, 8, _message->sublist_list);
+
   return OK;
 }
diff --git a/sandbox/plc4c/generated-sources/s7/src/tpkt_packet.c b/sandbox/plc4c/generated-sources/s7/src/tpkt_packet.c
index 324d1f7..6152816 100644
--- a/sandbox/plc4c/generated-sources/s7/src/tpkt_packet.c
+++ b/sandbox/plc4c/generated-sources/s7/src/tpkt_packet.c
@@ -64,6 +64,10 @@ plc4c_return_code plc4c_s7_read_write_tpkt_packet_parse(plc4c_spi_read_buffer* b
   return OK;
 }
 
-plc4c_return_code plc4c_s7_read_write_tpkt_packet_serialize(plc4c_spi_write_buffer* buf, plc4c_s7_read_write_tpkt_packet* message) {
+plc4c_return_code plc4c_s7_read_write_tpkt_packet_serialize(plc4c_spi_write_buffer* buf, plc4c_s7_read_write_tpkt_packet* _message) {
+
+  // Const Field (protocolId)
+  plc4c_spi_write_unsigned_short(buf, 8, S7_READ_WRITE_TPKT_PACKET_PROTOCOL_ID);
+
   return OK;
 }