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

commit d659670ea0234909f8737a1eed0eaf13368e1355
Author: Sebastian Rühl <[email protected]>
AuthorDate: Mon Apr 19 17:40:58 2021 +0200

    plc4go: implemented a xml reader based on the new ReadBuffer interface
---
 .../resources/templates/go/model-template.go.ftlh  |   4 +-
 plc4go/go.mod                                      |   2 +-
 .../model/AdsDeviceNotificationRequest.go          |   1 +
 .../ads/readwrite/model/AdsNotificationSample.go   |   1 +
 .../readwrite/model/AdsReadDeviceInfoResponse.go   |   1 +
 .../plc4go/ads/readwrite/model/AdsReadResponse.go  |   1 +
 .../ads/readwrite/model/AdsReadWriteRequest.go     |   2 +
 .../ads/readwrite/model/AdsReadWriteResponse.go    |   1 +
 .../plc4go/ads/readwrite/model/AdsStampHeader.go   |   1 +
 .../ads/readwrite/model/AdsWriteControlRequest.go  |   1 +
 .../plc4go/ads/readwrite/model/AdsWriteRequest.go  |   1 +
 .../bacnetip/readwrite/model/BACnetAddress.go      |   1 +
 ...firmedServiceRequestConfirmedCOVNotification.go |   2 +
 .../BACnetConfirmedServiceRequestReadProperty.go   |   1 +
 .../BACnetConfirmedServiceRequestSubscribeCOV.go   |   1 +
 .../BACnetConfirmedServiceRequestWriteProperty.go  |   1 +
 .../readwrite/model/BACnetErrorReadProperty.go     |   2 +
 .../model/BACnetServiceAckReadProperty.go          |   1 +
 .../model/BACnetTagApplicationBitString.go         |   1 +
 .../model/BACnetTagApplicationEnumerated.go        |   1 +
 .../model/BACnetTagApplicationSignedInteger.go     |   1 +
 .../model/BACnetTagApplicationUnsignedInteger.go   |   1 +
 .../bacnetip/readwrite/model/BACnetTagContext.go   |   1 +
 .../readwrite/model/BACnetTagWithContent.go        |   1 +
 .../model/BACnetUnconfirmedServiceRequestIAm.go    |   1 +
 ...rmedServiceRequestUnconfirmedPrivateTransfer.go |   1 +
 .../model/BACnetUnconfirmedServiceRequestWhoHas.go |   1 +
 .../model/BACnetUnconfirmedServiceRequestWhoIs.go  |   2 +
 .../bacnetip/readwrite/model/BVLCForwardedNPDU.go  |   1 +
 .../readwrite/model/NLMIAmRouterToNetwork.go       |   1 +
 .../readwrite/model/NLMWhoIsRouterToNetwork.go     |   1 +
 .../plc4go/bacnetip/readwrite/model/NPDU.go        |   2 +
 .../model/ApduDataDeviceDescriptorResponse.go      |   1 +
 .../readwrite/model/ApduDataExtAuthorizeRequest.go |   1 +
 .../model/ApduDataExtPropertyValueResponse.go      |   1 +
 .../model/ApduDataExtPropertyValueWrite.go         |   1 +
 .../readwrite/model/ApduDataGroupValueResponse.go  |   1 +
 .../readwrite/model/ApduDataGroupValueWrite.go     |   1 +
 .../readwrite/model/ApduDataMemoryResponse.go      |   1 +
 .../model/ComObjectTableRealisationType1.go        |   1 +
 .../model/ComObjectTableRealisationType2.go        |   1 +
 .../knxnetip/readwrite/model/DIBDeviceInfo.go      |   2 +
 .../knxnetip/readwrite/model/DIBSuppSvcFamilies.go |   1 +
 .../plc4go/knxnetip/readwrite/model/IPAddress.go   |   1 +
 .../plc4go/knxnetip/readwrite/model/LBusmonInd.go  |   1 +
 .../plc4go/knxnetip/readwrite/model/LDataCon.go    |   1 +
 .../knxnetip/readwrite/model/LDataExtended.go      |   1 +
 .../plc4go/knxnetip/readwrite/model/LDataInd.go    |   1 +
 .../plc4go/knxnetip/readwrite/model/LDataReq.go    |   1 +
 .../plc4go/knxnetip/readwrite/model/LPollData.go   |   1 +
 .../plc4go/knxnetip/readwrite/model/MACAddress.go  |   1 +
 .../knxnetip/readwrite/model/UnknownMessage.go     |   1 +
 .../model/ModbusPDUGetComEventLogResponse.go       |   1 +
 .../readwrite/model/ModbusPDUReadCoilsResponse.go  |   1 +
 .../model/ModbusPDUReadDiscreteInputsResponse.go   |   1 +
 .../model/ModbusPDUReadFifoQueueResponse.go        |   1 +
 .../model/ModbusPDUReadFileRecordRequest.go        |   1 +
 .../model/ModbusPDUReadFileRecordResponse.go       |   1 +
 .../model/ModbusPDUReadFileRecordResponseItem.go   |   1 +
 .../model/ModbusPDUReadHoldingRegistersResponse.go |   1 +
 .../model/ModbusPDUReadInputRegistersResponse.go   |   1 +
 ...sPDUReadWriteMultipleHoldingRegistersRequest.go |   1 +
 ...PDUReadWriteMultipleHoldingRegistersResponse.go |   1 +
 .../model/ModbusPDUReportServerIdResponse.go       |   1 +
 .../model/ModbusPDUWriteFileRecordRequest.go       |   1 +
 .../model/ModbusPDUWriteFileRecordRequestItem.go   |   1 +
 .../model/ModbusPDUWriteFileRecordResponse.go      |   1 +
 .../model/ModbusPDUWriteFileRecordResponseItem.go  |   1 +
 .../model/ModbusPDUWriteMultipleCoilsRequest.go    |   1 +
 ...odbusPDUWriteMultipleHoldingRegistersRequest.go |   1 +
 .../plc4go/s7/readwrite/model/COTPPacket.go        |   1 +
 ...COTPParameterDisconnectAdditionalInformation.go |   1 +
 .../readwrite/model/S7ParameterReadVarRequest.go   |   1 +
 .../s7/readwrite/model/S7ParameterUserData.go      |   1 +
 .../readwrite/model/S7ParameterWriteVarRequest.go  |   1 +
 .../s7/readwrite/model/S7PayloadReadVarResponse.go |   1 +
 .../plc4go/s7/readwrite/model/S7PayloadUserData.go |   1 +
 ...ayloadUserDataItemCpuFunctionReadSzlResponse.go |   1 +
 .../s7/readwrite/model/S7PayloadWriteVarRequest.go |   1 +
 .../readwrite/model/S7PayloadWriteVarResponse.go   |   1 +
 .../s7/readwrite/model/S7VarPayloadDataItem.go     |   1 +
 .../plc4go/s7/readwrite/model/SzlDataTreeItem.go   |   1 +
 plc4go/internal/plc4go/s7/s7Io_test.go             |  20 +-
 .../plc4go/spi/utils/ReadBufferByteBased.go        |  50 +-
 .../plc4go/spi/utils/ReadBufferByteBased_test.go   | 504 ++++++++++-----------
 .../plc4go/spi/utils/ReadBufferXmlBased.go         | 346 ++++++++++++++
 plc4go/internal/plc4go/spi/utils/WriteBuffer.go    |   1 +
 .../plc4go/spi/utils/WriteBufferBoxBased.go        |   6 +
 .../plc4go/spi/utils/WriteBufferByteBased.go       |  46 +-
 .../plc4go/spi/utils/WriteBufferXmlBased.go        |   7 +
 90 files changed, 766 insertions(+), 306 deletions(-)

diff --git 
a/build-utils/language-go/src/main/resources/templates/go/model-template.go.ftlh
 
b/build-utils/language-go/src/main/resources/templates/go/model-template.go.ftlh
index 40f39bd..e659504 100644
--- 
a/build-utils/language-go/src/main/resources/templates/go/model-template.go.ftlh
+++ 
b/build-utils/language-go/src/main/resources/templates/go/model-template.go.ftlh
@@ -542,9 +542,9 @@ func ${type.name}Parse(io utils.ReadBuffer<#if 
type.parserArguments?has_content>
                <#switch field.typeName>
                        <#case "array">
                                <#assign arrayField = field>
-       io.PullContext("${arrayField.name}")
 
        // Array field (${arrayField.name})
+       io.PullContext("${arrayField.name}")
                        <#-- Only update curPos if the length expression uses 
it -->
                                <#if 
arrayField.loopExpression.contains("curPos")>
        curPos = io.GetPos() - startPos<@emitImport import="io" />
@@ -596,9 +596,9 @@ func ${type.name}Parse(io utils.ReadBuffer<#if 
type.parserArguments?has_content>
                                        <#if 
arrayField.loopExpression.contains("curPos")>
                curPos = io.GetPos() - startPos<@emitImport import="io" />
                                        </#if>
-               io.CloseContext("${arrayField.name}")
        }
                                </#if>
+       io.CloseContext("${arrayField.name}")
                                <#break>
                        <#case "checksum">
                                <#assign checksumField = field>
diff --git a/plc4go/go.mod b/plc4go/go.mod
index d1c879b..9f93746 100644
--- a/plc4go/go.mod
+++ b/plc4go/go.mod
@@ -28,6 +28,6 @@ require (
        github.com/rs/zerolog v1.20.0
        github.com/subchen/go-xmldom v1.1.2
        github.com/tebeka/go2xunit v1.4.10 // indirect
-       golang.org/x/tools v0.1.0 // indirect
+       golang.org/x/tools v0.1.0
        gotest.tools/gotestsum v1.6.4 // indirect
 )
diff --git 
a/plc4go/internal/plc4go/ads/readwrite/model/AdsDeviceNotificationRequest.go 
b/plc4go/internal/plc4go/ads/readwrite/model/AdsDeviceNotificationRequest.go
index 9bc6387..3344364 100644
--- a/plc4go/internal/plc4go/ads/readwrite/model/AdsDeviceNotificationRequest.go
+++ b/plc4go/internal/plc4go/ads/readwrite/model/AdsDeviceNotificationRequest.go
@@ -147,6 +147,7 @@ func AdsDeviceNotificationRequestParse(io utils.ReadBuffer) 
(*AdsData, error) {
                }
                adsStampHeaders[curItem] = _item
        }
+       io.CloseContext("adsStampHeaders")
 
        io.CloseContext("AdsDeviceNotificationRequest")
 
diff --git 
a/plc4go/internal/plc4go/ads/readwrite/model/AdsNotificationSample.go 
b/plc4go/internal/plc4go/ads/readwrite/model/AdsNotificationSample.go
index 3d7d351..9664b13 100644
--- a/plc4go/internal/plc4go/ads/readwrite/model/AdsNotificationSample.go
+++ b/plc4go/internal/plc4go/ads/readwrite/model/AdsNotificationSample.go
@@ -118,6 +118,7 @@ func AdsNotificationSampleParse(io utils.ReadBuffer) 
(*AdsNotificationSample, er
                }
                data[curItem] = _item
        }
+       io.CloseContext("data")
 
        io.CloseContext("AdsNotificationSample")
 
diff --git 
a/plc4go/internal/plc4go/ads/readwrite/model/AdsReadDeviceInfoResponse.go 
b/plc4go/internal/plc4go/ads/readwrite/model/AdsReadDeviceInfoResponse.go
index d5a8db7..e279ae8 100644
--- a/plc4go/internal/plc4go/ads/readwrite/model/AdsReadDeviceInfoResponse.go
+++ b/plc4go/internal/plc4go/ads/readwrite/model/AdsReadDeviceInfoResponse.go
@@ -168,6 +168,7 @@ func AdsReadDeviceInfoResponseParse(io utils.ReadBuffer) 
(*AdsData, error) {
                }
                device[curItem] = _item
        }
+       io.CloseContext("device")
 
        io.CloseContext("AdsReadDeviceInfoResponse")
 
diff --git a/plc4go/internal/plc4go/ads/readwrite/model/AdsReadResponse.go 
b/plc4go/internal/plc4go/ads/readwrite/model/AdsReadResponse.go
index ba102bc..a89d200 100644
--- a/plc4go/internal/plc4go/ads/readwrite/model/AdsReadResponse.go
+++ b/plc4go/internal/plc4go/ads/readwrite/model/AdsReadResponse.go
@@ -145,6 +145,7 @@ func AdsReadResponseParse(io utils.ReadBuffer) (*AdsData, 
error) {
                }
                data[curItem] = _item
        }
+       io.CloseContext("data")
 
        io.CloseContext("AdsReadResponse")
 
diff --git a/plc4go/internal/plc4go/ads/readwrite/model/AdsReadWriteRequest.go 
b/plc4go/internal/plc4go/ads/readwrite/model/AdsReadWriteRequest.go
index 6a78dd3..322a1e7 100644
--- a/plc4go/internal/plc4go/ads/readwrite/model/AdsReadWriteRequest.go
+++ b/plc4go/internal/plc4go/ads/readwrite/model/AdsReadWriteRequest.go
@@ -177,6 +177,7 @@ func AdsReadWriteRequestParse(io utils.ReadBuffer) 
(*AdsData, error) {
                }
                items[curItem] = _item
        }
+       io.CloseContext("items")
        io.PullContext("data")
 
        // Array field (data)
@@ -189,6 +190,7 @@ func AdsReadWriteRequestParse(io utils.ReadBuffer) 
(*AdsData, error) {
                }
                data[curItem] = _item
        }
+       io.CloseContext("data")
 
        io.CloseContext("AdsReadWriteRequest")
 
diff --git a/plc4go/internal/plc4go/ads/readwrite/model/AdsReadWriteResponse.go 
b/plc4go/internal/plc4go/ads/readwrite/model/AdsReadWriteResponse.go
index 1c78f7c..d72edda 100644
--- a/plc4go/internal/plc4go/ads/readwrite/model/AdsReadWriteResponse.go
+++ b/plc4go/internal/plc4go/ads/readwrite/model/AdsReadWriteResponse.go
@@ -145,6 +145,7 @@ func AdsReadWriteResponseParse(io utils.ReadBuffer) 
(*AdsData, error) {
                }
                data[curItem] = _item
        }
+       io.CloseContext("data")
 
        io.CloseContext("AdsReadWriteResponse")
 
diff --git a/plc4go/internal/plc4go/ads/readwrite/model/AdsStampHeader.go 
b/plc4go/internal/plc4go/ads/readwrite/model/AdsStampHeader.go
index e583b34..b479c27 100644
--- a/plc4go/internal/plc4go/ads/readwrite/model/AdsStampHeader.go
+++ b/plc4go/internal/plc4go/ads/readwrite/model/AdsStampHeader.go
@@ -119,6 +119,7 @@ func AdsStampHeaderParse(io utils.ReadBuffer) 
(*AdsStampHeader, error) {
                }
                adsNotificationSamples[curItem] = _item
        }
+       io.CloseContext("adsNotificationSamples")
 
        io.CloseContext("AdsStampHeader")
 
diff --git 
a/plc4go/internal/plc4go/ads/readwrite/model/AdsWriteControlRequest.go 
b/plc4go/internal/plc4go/ads/readwrite/model/AdsWriteControlRequest.go
index 5f6285d..18990fa 100644
--- a/plc4go/internal/plc4go/ads/readwrite/model/AdsWriteControlRequest.go
+++ b/plc4go/internal/plc4go/ads/readwrite/model/AdsWriteControlRequest.go
@@ -156,6 +156,7 @@ func AdsWriteControlRequestParse(io utils.ReadBuffer) 
(*AdsData, error) {
                }
                data[curItem] = _item
        }
+       io.CloseContext("data")
 
        io.CloseContext("AdsWriteControlRequest")
 
diff --git a/plc4go/internal/plc4go/ads/readwrite/model/AdsWriteRequest.go 
b/plc4go/internal/plc4go/ads/readwrite/model/AdsWriteRequest.go
index 96dfecb..eb721af 100644
--- a/plc4go/internal/plc4go/ads/readwrite/model/AdsWriteRequest.go
+++ b/plc4go/internal/plc4go/ads/readwrite/model/AdsWriteRequest.go
@@ -156,6 +156,7 @@ func AdsWriteRequestParse(io utils.ReadBuffer) (*AdsData, 
error) {
                }
                data[curItem] = _item
        }
+       io.CloseContext("data")
 
        io.CloseContext("AdsWriteRequest")
 
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetAddress.go 
b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetAddress.go
index 40b40fd..01c9e16 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetAddress.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetAddress.go
@@ -100,6 +100,7 @@ func BACnetAddressParse(io utils.ReadBuffer) 
(*BACnetAddress, error) {
                }
                address[curItem] = _item
        }
+       io.CloseContext("address")
 
        // Simple Field (port)
        port, _portErr := io.ReadUint16("port", 16)
diff --git 
a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedCOVNotification.go
 
b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedCOVNotification.go
index 041adca..fbdbfab 100644
--- 
a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedCOVNotification.go
+++ 
b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedCOVNotification.go
@@ -258,6 +258,7 @@ func 
BACnetConfirmedServiceRequestConfirmedCOVNotificationParse(io utils.ReadBuf
                }
                lifetimeSeconds[curItem] = _item
        }
+       io.CloseContext("lifetimeSeconds")
 
        // Const Field (listOfValuesOpeningTag)
        listOfValuesOpeningTag, _listOfValuesOpeningTagErr := 
io.ReadUint8("listOfValuesOpeningTag", 8)
@@ -281,6 +282,7 @@ func 
BACnetConfirmedServiceRequestConfirmedCOVNotificationParse(io utils.ReadBuf
                }
                notifications = append(notifications, _item)
        }
+       io.CloseContext("notifications")
 
        // Const Field (listOfValuesClosingTag)
        listOfValuesClosingTag, _listOfValuesClosingTagErr := 
io.ReadUint8("listOfValuesClosingTag", 8)
diff --git 
a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReadProperty.go
 
b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReadProperty.go
index 1269b19..2d1cb4f 100644
--- 
a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReadProperty.go
+++ 
b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReadProperty.go
@@ -182,6 +182,7 @@ func BACnetConfirmedServiceRequestReadPropertyParse(io 
utils.ReadBuffer) (*BACne
                }
                propertyIdentifier[curItem] = _item
        }
+       io.CloseContext("propertyIdentifier")
 
        io.CloseContext("BACnetConfirmedServiceRequestReadProperty")
 
diff --git 
a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestSubscribeCOV.go
 
b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestSubscribeCOV.go
index b34e82a..3eeefcb 100644
--- 
a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestSubscribeCOV.go
+++ 
b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestSubscribeCOV.go
@@ -243,6 +243,7 @@ func BACnetConfirmedServiceRequestSubscribeCOVParse(io 
utils.ReadBuffer) (*BACne
                }
                lifetimeSeconds[curItem] = _item
        }
+       io.CloseContext("lifetimeSeconds")
 
        io.CloseContext("BACnetConfirmedServiceRequestSubscribeCOV")
 
diff --git 
a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestWriteProperty.go
 
b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestWriteProperty.go
index 0a7ee68..fd72cc2 100644
--- 
a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestWriteProperty.go
+++ 
b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestWriteProperty.go
@@ -204,6 +204,7 @@ func BACnetConfirmedServiceRequestWritePropertyParse(io 
utils.ReadBuffer, len ui
                }
                propertyIdentifier[curItem] = _item
        }
+       io.CloseContext("propertyIdentifier")
 
        // Const Field (openingTag)
        openingTag, _openingTagErr := io.ReadUint8("openingTag", 8)
diff --git 
a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorReadProperty.go 
b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorReadProperty.go
index c6ca28f..92e6674 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorReadProperty.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorReadProperty.go
@@ -163,6 +163,7 @@ func BACnetErrorReadPropertyParse(io utils.ReadBuffer) 
(*BACnetError, error) {
                }
                errorClass[curItem] = _item
        }
+       io.CloseContext("errorClass")
 
        // Const Field (errorCodeHeader)
        errorCodeHeader, _errorCodeHeaderErr := io.ReadUint8("errorCodeHeader", 
5)
@@ -190,6 +191,7 @@ func BACnetErrorReadPropertyParse(io utils.ReadBuffer) 
(*BACnetError, error) {
                }
                errorCode[curItem] = _item
        }
+       io.CloseContext("errorCode")
 
        io.CloseContext("BACnetErrorReadProperty")
 
diff --git 
a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckReadProperty.go
 
b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckReadProperty.go
index c3bce18..52c33ec 100644
--- 
a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckReadProperty.go
+++ 
b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckReadProperty.go
@@ -195,6 +195,7 @@ func BACnetServiceAckReadPropertyParse(io utils.ReadBuffer) 
(*BACnetServiceAck,
                }
                propertyIdentifier[curItem] = _item
        }
+       io.CloseContext("propertyIdentifier")
 
        // Const Field (openingTag)
        openingTag, _openingTagErr := io.ReadUint8("openingTag", 8)
diff --git 
a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationBitString.go
 
b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationBitString.go
index 2316075..b109cbb 100644
--- 
a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationBitString.go
+++ 
b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationBitString.go
@@ -137,6 +137,7 @@ func BACnetTagApplicationBitStringParse(io 
utils.ReadBuffer, lengthValueType uin
                }
                data = append(data, _item)
        }
+       io.CloseContext("data")
 
        io.CloseContext("BACnetTagApplicationBitString")
 
diff --git 
a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationEnumerated.go
 
b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationEnumerated.go
index 9b469b4..eb09871 100644
--- 
a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationEnumerated.go
+++ 
b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationEnumerated.go
@@ -126,6 +126,7 @@ func BACnetTagApplicationEnumeratedParse(io 
utils.ReadBuffer, lengthValueType ui
                }
                data = append(data, _item)
        }
+       io.CloseContext("data")
 
        io.CloseContext("BACnetTagApplicationEnumerated")
 
diff --git 
a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationSignedInteger.go
 
b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationSignedInteger.go
index bb55169..be60a2d 100644
--- 
a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationSignedInteger.go
+++ 
b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationSignedInteger.go
@@ -126,6 +126,7 @@ func BACnetTagApplicationSignedIntegerParse(io 
utils.ReadBuffer, lengthValueType
                }
                data = append(data, _item)
        }
+       io.CloseContext("data")
 
        io.CloseContext("BACnetTagApplicationSignedInteger")
 
diff --git 
a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationUnsignedInteger.go
 
b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationUnsignedInteger.go
index ade1353..712ca43 100644
--- 
a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationUnsignedInteger.go
+++ 
b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationUnsignedInteger.go
@@ -126,6 +126,7 @@ func BACnetTagApplicationUnsignedIntegerParse(io 
utils.ReadBuffer, lengthValueTy
                }
                data = append(data, _item)
        }
+       io.CloseContext("data")
 
        io.CloseContext("BACnetTagApplicationUnsignedInteger")
 
diff --git 
a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagContext.go 
b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagContext.go
index cca4dd3..f709ac0 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagContext.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagContext.go
@@ -126,6 +126,7 @@ func BACnetTagContextParse(io utils.ReadBuffer, 
typeOrTagNumber uint8, extTagNum
                }
                data = append(data, _item)
        }
+       io.CloseContext("data")
 
        io.CloseContext("BACnetTagContext")
 
diff --git 
a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagWithContent.go 
b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagWithContent.go
index 76c33cb..a3820e2 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagWithContent.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagWithContent.go
@@ -176,6 +176,7 @@ func BACnetTagWithContentParse(io utils.ReadBuffer) 
(*BACnetTagWithContent, erro
                }
                propertyIdentifier = append(propertyIdentifier, _item)
        }
+       io.CloseContext("propertyIdentifier")
 
        // Const Field (openTag)
        openTag, _openTagErr := io.ReadUint8("openTag", 8)
diff --git 
a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestIAm.go
 
b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestIAm.go
index 8051c33..63c12c8 100644
--- 
a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestIAm.go
+++ 
b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestIAm.go
@@ -200,6 +200,7 @@ func BACnetUnconfirmedServiceRequestIAmParse(io 
utils.ReadBuffer) (*BACnetUnconf
                }
                maximumApduLengthAccepted[curItem] = _item
        }
+       io.CloseContext("maximumApduLengthAccepted")
 
        // Const Field (segmentationSupportedHeader)
        segmentationSupportedHeader, _segmentationSupportedHeaderErr := 
io.ReadUint8("segmentationSupportedHeader", 8)
diff --git 
a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer.go
 
b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer.go
index e3ed9c4..8bf080c 100644
--- 
a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer.go
+++ 
b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer.go
@@ -190,6 +190,7 @@ func 
BACnetUnconfirmedServiceRequestUnconfirmedPrivateTransferParse(io utils.Rea
                }
                values = append(values, _item)
        }
+       io.CloseContext("values")
 
        // Const Field (listOfValuesClosingTag)
        listOfValuesClosingTag, _listOfValuesClosingTagErr := 
io.ReadUint8("listOfValuesClosingTag", 8)
diff --git 
a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestWhoHas.go
 
b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestWhoHas.go
index 3ed7062..994a652 100644
--- 
a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestWhoHas.go
+++ 
b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestWhoHas.go
@@ -207,6 +207,7 @@ func BACnetUnconfirmedServiceRequestWhoHasParse(io 
utils.ReadBuffer) (*BACnetUnc
                }
                objectName = append(objectName, _item)
        }
+       io.CloseContext("objectName")
 
        io.CloseContext("BACnetUnconfirmedServiceRequestWhoHas")
 
diff --git 
a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestWhoIs.go
 
b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestWhoIs.go
index 017ccbe..c7b8a13 100644
--- 
a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestWhoIs.go
+++ 
b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestWhoIs.go
@@ -163,6 +163,7 @@ func BACnetUnconfirmedServiceRequestWhoIsParse(io 
utils.ReadBuffer) (*BACnetUnco
                }
                deviceInstanceRangeLowLimit[curItem] = _item
        }
+       io.CloseContext("deviceInstanceRangeLowLimit")
 
        // Const Field (deviceInstanceRangeHighLimitHeader)
        deviceInstanceRangeHighLimitHeader, 
_deviceInstanceRangeHighLimitHeaderErr := 
io.ReadUint8("deviceInstanceRangeHighLimitHeader", 5)
@@ -190,6 +191,7 @@ func BACnetUnconfirmedServiceRequestWhoIsParse(io 
utils.ReadBuffer) (*BACnetUnco
                }
                deviceInstanceRangeHighLimit[curItem] = _item
        }
+       io.CloseContext("deviceInstanceRangeHighLimit")
 
        io.CloseContext("BACnetUnconfirmedServiceRequestWhoIs")
 
diff --git 
a/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCForwardedNPDU.go 
b/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCForwardedNPDU.go
index a07b9f3..01d4496 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCForwardedNPDU.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCForwardedNPDU.go
@@ -128,6 +128,7 @@ func BVLCForwardedNPDUParse(io utils.ReadBuffer, bvlcLength 
uint16) (*BVLC, erro
                }
                ip[curItem] = _item
        }
+       io.CloseContext("ip")
 
        // Simple Field (port)
        port, _portErr := io.ReadUint16("port", 16)
diff --git 
a/plc4go/internal/plc4go/bacnetip/readwrite/model/NLMIAmRouterToNetwork.go 
b/plc4go/internal/plc4go/bacnetip/readwrite/model/NLMIAmRouterToNetwork.go
index c344692..a6ca2cb 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/NLMIAmRouterToNetwork.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/NLMIAmRouterToNetwork.go
@@ -121,6 +121,7 @@ func NLMIAmRouterToNetworkParse(io utils.ReadBuffer, 
apduLength uint16, messageT
                }
                destinationNetworkAddress = append(destinationNetworkAddress, 
_item)
        }
+       io.CloseContext("destinationNetworkAddress")
 
        io.CloseContext("NLMIAmRouterToNetwork")
 
diff --git 
a/plc4go/internal/plc4go/bacnetip/readwrite/model/NLMWhoIsRouterToNetwork.go 
b/plc4go/internal/plc4go/bacnetip/readwrite/model/NLMWhoIsRouterToNetwork.go
index e5b3750..25bae66 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/NLMWhoIsRouterToNetwork.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/NLMWhoIsRouterToNetwork.go
@@ -121,6 +121,7 @@ func NLMWhoIsRouterToNetworkParse(io utils.ReadBuffer, 
apduLength uint16, messag
                }
                destinationNetworkAddress = append(destinationNetworkAddress, 
_item)
        }
+       io.CloseContext("destinationNetworkAddress")
 
        io.CloseContext("NLMWhoIsRouterToNetwork")
 
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/NPDU.go 
b/plc4go/internal/plc4go/bacnetip/readwrite/model/NPDU.go
index 0eb0439..ddd21a7 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/NPDU.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/NPDU.go
@@ -260,6 +260,7 @@ func NPDUParse(io utils.ReadBuffer, npduLength uint16) 
(*NPDU, error) {
                }
                destinationAddress[curItem] = _item
        }
+       io.CloseContext("destinationAddress")
 
        // Optional Field (sourceNetworkAddress) (Can be skipped, if a given 
expression evaluates to false)
        var sourceNetworkAddress *uint16 = nil
@@ -292,6 +293,7 @@ func NPDUParse(io utils.ReadBuffer, npduLength uint16) 
(*NPDU, error) {
                }
                sourceAddress[curItem] = _item
        }
+       io.CloseContext("sourceAddress")
 
        // Optional Field (hopCount) (Can be skipped, if a given expression 
evaluates to false)
        var hopCount *uint8 = nil
diff --git 
a/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataDeviceDescriptorResponse.go
 
b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataDeviceDescriptorResponse.go
index 56aa4a3..30949eb 100644
--- 
a/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataDeviceDescriptorResponse.go
+++ 
b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataDeviceDescriptorResponse.go
@@ -131,6 +131,7 @@ func ApduDataDeviceDescriptorResponseParse(io 
utils.ReadBuffer, dataLength uint8
                }
                data[curItem] = _item
        }
+       io.CloseContext("data")
 
        io.CloseContext("ApduDataDeviceDescriptorResponse")
 
diff --git 
a/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtAuthorizeRequest.go
 
b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtAuthorizeRequest.go
index 4ef4716..50a5ed9 100644
--- 
a/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtAuthorizeRequest.go
+++ 
b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtAuthorizeRequest.go
@@ -129,6 +129,7 @@ func ApduDataExtAuthorizeRequestParse(io utils.ReadBuffer) 
(*ApduDataExt, error)
                }
                data[curItem] = _item
        }
+       io.CloseContext("data")
 
        io.CloseContext("ApduDataExtAuthorizeRequest")
 
diff --git 
a/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtPropertyValueResponse.go
 
b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtPropertyValueResponse.go
index 29a65c6..3fa5f4a 100644
--- 
a/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtPropertyValueResponse.go
+++ 
b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtPropertyValueResponse.go
@@ -162,6 +162,7 @@ func ApduDataExtPropertyValueResponseParse(io 
utils.ReadBuffer, length uint8) (*
                }
                data[curItem] = _item
        }
+       io.CloseContext("data")
 
        io.CloseContext("ApduDataExtPropertyValueResponse")
 
diff --git 
a/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtPropertyValueWrite.go
 
b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtPropertyValueWrite.go
index b867a14..cb7c832 100644
--- 
a/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtPropertyValueWrite.go
+++ 
b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtPropertyValueWrite.go
@@ -162,6 +162,7 @@ func ApduDataExtPropertyValueWriteParse(io 
utils.ReadBuffer, length uint8) (*Apd
                }
                data[curItem] = _item
        }
+       io.CloseContext("data")
 
        io.CloseContext("ApduDataExtPropertyValueWrite")
 
diff --git 
a/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataGroupValueResponse.go 
b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataGroupValueResponse.go
index 5b73e13..32c92e7 100644
--- 
a/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataGroupValueResponse.go
+++ 
b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataGroupValueResponse.go
@@ -131,6 +131,7 @@ func ApduDataGroupValueResponseParse(io utils.ReadBuffer, 
dataLength uint8) (*Ap
                }
                data[curItem] = _item
        }
+       io.CloseContext("data")
 
        io.CloseContext("ApduDataGroupValueResponse")
 
diff --git 
a/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataGroupValueWrite.go 
b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataGroupValueWrite.go
index 8dba516..746007d 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataGroupValueWrite.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataGroupValueWrite.go
@@ -131,6 +131,7 @@ func ApduDataGroupValueWriteParse(io utils.ReadBuffer, 
dataLength uint8) (*ApduD
                }
                data[curItem] = _item
        }
+       io.CloseContext("data")
 
        io.CloseContext("ApduDataGroupValueWrite")
 
diff --git 
a/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataMemoryResponse.go 
b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataMemoryResponse.go
index 537a278..423837d 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataMemoryResponse.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataMemoryResponse.go
@@ -139,6 +139,7 @@ func ApduDataMemoryResponseParse(io utils.ReadBuffer) 
(*ApduData, error) {
                }
                data[curItem] = _item
        }
+       io.CloseContext("data")
 
        io.CloseContext("ApduDataMemoryResponse")
 
diff --git 
a/plc4go/internal/plc4go/knxnetip/readwrite/model/ComObjectTableRealisationType1.go
 
b/plc4go/internal/plc4go/knxnetip/readwrite/model/ComObjectTableRealisationType1.go
index 0203f7c..2010728 100644
--- 
a/plc4go/internal/plc4go/knxnetip/readwrite/model/ComObjectTableRealisationType1.go
+++ 
b/plc4go/internal/plc4go/knxnetip/readwrite/model/ComObjectTableRealisationType1.go
@@ -143,6 +143,7 @@ func ComObjectTableRealisationType1Parse(io 
utils.ReadBuffer) (*ComObjectTable,
                }
                comObjectDescriptors[curItem] = _item
        }
+       io.CloseContext("comObjectDescriptors")
 
        io.CloseContext("ComObjectTableRealisationType1")
 
diff --git 
a/plc4go/internal/plc4go/knxnetip/readwrite/model/ComObjectTableRealisationType2.go
 
b/plc4go/internal/plc4go/knxnetip/readwrite/model/ComObjectTableRealisationType2.go
index eb38257..5db34a8 100644
--- 
a/plc4go/internal/plc4go/knxnetip/readwrite/model/ComObjectTableRealisationType2.go
+++ 
b/plc4go/internal/plc4go/knxnetip/readwrite/model/ComObjectTableRealisationType2.go
@@ -143,6 +143,7 @@ func ComObjectTableRealisationType2Parse(io 
utils.ReadBuffer) (*ComObjectTable,
                }
                comObjectDescriptors[curItem] = _item
        }
+       io.CloseContext("comObjectDescriptors")
 
        io.CloseContext("ComObjectTableRealisationType2")
 
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/DIBDeviceInfo.go 
b/plc4go/internal/plc4go/knxnetip/readwrite/model/DIBDeviceInfo.go
index 08ae060..97ba43f 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/DIBDeviceInfo.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/DIBDeviceInfo.go
@@ -172,6 +172,7 @@ func DIBDeviceInfoParse(io utils.ReadBuffer) 
(*DIBDeviceInfo, error) {
                }
                knxNetIpDeviceSerialNumber[curItem] = _item
        }
+       io.CloseContext("knxNetIpDeviceSerialNumber")
 
        // Simple Field (knxNetIpDeviceMulticastAddress)
        knxNetIpDeviceMulticastAddress, _knxNetIpDeviceMulticastAddressErr := 
IPAddressParse(io)
@@ -196,6 +197,7 @@ func DIBDeviceInfoParse(io utils.ReadBuffer) 
(*DIBDeviceInfo, error) {
                }
                deviceFriendlyName[curItem] = _item
        }
+       io.CloseContext("deviceFriendlyName")
 
        io.CloseContext("DIBDeviceInfo")
 
diff --git 
a/plc4go/internal/plc4go/knxnetip/readwrite/model/DIBSuppSvcFamilies.go 
b/plc4go/internal/plc4go/knxnetip/readwrite/model/DIBSuppSvcFamilies.go
index f849f0d..2c4c72d 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/DIBSuppSvcFamilies.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/DIBSuppSvcFamilies.go
@@ -120,6 +120,7 @@ func DIBSuppSvcFamiliesParse(io utils.ReadBuffer) 
(*DIBSuppSvcFamilies, error) {
                }
                serviceIds = append(serviceIds, _item)
        }
+       io.CloseContext("serviceIds")
 
        io.CloseContext("DIBSuppSvcFamilies")
 
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/IPAddress.go 
b/plc4go/internal/plc4go/knxnetip/readwrite/model/IPAddress.go
index 039b0cc..815f811 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/IPAddress.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/IPAddress.go
@@ -98,6 +98,7 @@ func IPAddressParse(io utils.ReadBuffer) (*IPAddress, error) {
                }
                addr[curItem] = _item
        }
+       io.CloseContext("addr")
 
        io.CloseContext("IPAddress")
 
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/LBusmonInd.go 
b/plc4go/internal/plc4go/knxnetip/readwrite/model/LBusmonInd.go
index 64b15b7..cc9c65f 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/LBusmonInd.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/LBusmonInd.go
@@ -146,6 +146,7 @@ func LBusmonIndParse(io utils.ReadBuffer) (*CEMI, error) {
                }
                additionalInformation = append(additionalInformation, _item)
        }
+       io.CloseContext("additionalInformation")
 
        // Simple Field (dataFrame)
        dataFrame, _dataFrameErr := LDataFrameParse(io)
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataCon.go 
b/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataCon.go
index 6391d07..0985cef 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataCon.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataCon.go
@@ -138,6 +138,7 @@ func LDataConParse(io utils.ReadBuffer) (*CEMI, error) {
                }
                additionalInformation = append(additionalInformation, _item)
        }
+       io.CloseContext("additionalInformation")
 
        // Simple Field (dataFrame)
        dataFrame, _dataFrameErr := LDataFrameParse(io)
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataExtended.go 
b/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataExtended.go
index 882ade3..b82c2a7 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataExtended.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataExtended.go
@@ -181,6 +181,7 @@ func LDataExtendedParse(io utils.ReadBuffer) (*LDataFrame, 
error) {
                }
                destinationAddress[curItem] = _item
        }
+       io.CloseContext("destinationAddress")
 
        // Implicit Field (dataLength) (Used for parsing, but it's value is not 
stored as it's implicitly given by the objects content)
        dataLength, _dataLengthErr := io.ReadUint8("dataLength", 8)
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataInd.go 
b/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataInd.go
index 0717368..0227623 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataInd.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataInd.go
@@ -138,6 +138,7 @@ func LDataIndParse(io utils.ReadBuffer) (*CEMI, error) {
                }
                additionalInformation = append(additionalInformation, _item)
        }
+       io.CloseContext("additionalInformation")
 
        // Simple Field (dataFrame)
        dataFrame, _dataFrameErr := LDataFrameParse(io)
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataReq.go 
b/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataReq.go
index 44e0fec..06dfcde 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataReq.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataReq.go
@@ -138,6 +138,7 @@ func LDataReqParse(io utils.ReadBuffer) (*CEMI, error) {
                }
                additionalInformation = append(additionalInformation, _item)
        }
+       io.CloseContext("additionalInformation")
 
        // Simple Field (dataFrame)
        dataFrame, _dataFrameErr := LDataFrameParse(io)
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/LPollData.go 
b/plc4go/internal/plc4go/knxnetip/readwrite/model/LPollData.go
index bda240e..e289b0d 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/LPollData.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/LPollData.go
@@ -149,6 +149,7 @@ func LPollDataParse(io utils.ReadBuffer) (*LDataFrame, 
error) {
                }
                targetAddress[curItem] = _item
        }
+       io.CloseContext("targetAddress")
 
        // Reserved Field (Compartmentalized so the "reserved" variable can't 
leak)
        {
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/MACAddress.go 
b/plc4go/internal/plc4go/knxnetip/readwrite/model/MACAddress.go
index aa3070e..284f828 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/MACAddress.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/MACAddress.go
@@ -98,6 +98,7 @@ func MACAddressParse(io utils.ReadBuffer) (*MACAddress, 
error) {
                }
                addr[curItem] = _item
        }
+       io.CloseContext("addr")
 
        io.CloseContext("MACAddress")
 
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/UnknownMessage.go 
b/plc4go/internal/plc4go/knxnetip/readwrite/model/UnknownMessage.go
index e6488d1..91d7d37 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/UnknownMessage.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/UnknownMessage.go
@@ -120,6 +120,7 @@ func UnknownMessageParse(io utils.ReadBuffer, totalLength 
uint16) (*KnxNetIpMess
                }
                unknownData[curItem] = _item
        }
+       io.CloseContext("unknownData")
 
        io.CloseContext("UnknownMessage")
 
diff --git 
a/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUGetComEventLogResponse.go
 
b/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUGetComEventLogResponse.go
index 97073a3..4ed8845 100644
--- 
a/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUGetComEventLogResponse.go
+++ 
b/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUGetComEventLogResponse.go
@@ -171,6 +171,7 @@ func ModbusPDUGetComEventLogResponseParse(io 
utils.ReadBuffer) (*ModbusPDU, erro
                }
                events[curItem] = _item
        }
+       io.CloseContext("events")
 
        io.CloseContext("ModbusPDUGetComEventLogResponse")
 
diff --git 
a/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadCoilsResponse.go 
b/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadCoilsResponse.go
index 0b5ae78..a3690b3 100644
--- 
a/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadCoilsResponse.go
+++ 
b/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadCoilsResponse.go
@@ -138,6 +138,7 @@ func ModbusPDUReadCoilsResponseParse(io utils.ReadBuffer) 
(*ModbusPDU, error) {
                }
                value[curItem] = _item
        }
+       io.CloseContext("value")
 
        io.CloseContext("ModbusPDUReadCoilsResponse")
 
diff --git 
a/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadDiscreteInputsResponse.go
 
b/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadDiscreteInputsResponse.go
index cb2721e..71b0d49 100644
--- 
a/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadDiscreteInputsResponse.go
+++ 
b/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadDiscreteInputsResponse.go
@@ -138,6 +138,7 @@ func ModbusPDUReadDiscreteInputsResponseParse(io 
utils.ReadBuffer) (*ModbusPDU,
                }
                value[curItem] = _item
        }
+       io.CloseContext("value")
 
        io.CloseContext("ModbusPDUReadDiscreteInputsResponse")
 
diff --git 
a/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadFifoQueueResponse.go
 
b/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadFifoQueueResponse.go
index 5c51275..d6db4cf 100644
--- 
a/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadFifoQueueResponse.go
+++ 
b/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadFifoQueueResponse.go
@@ -146,6 +146,7 @@ func ModbusPDUReadFifoQueueResponseParse(io 
utils.ReadBuffer) (*ModbusPDU, error
                }
                fifoValue[curItem] = _item
        }
+       io.CloseContext("fifoValue")
 
        io.CloseContext("ModbusPDUReadFifoQueueResponse")
 
diff --git 
a/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadFileRecordRequest.go
 
b/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadFileRecordRequest.go
index 52b1c7d..fc70138 100644
--- 
a/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadFileRecordRequest.go
+++ 
b/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadFileRecordRequest.go
@@ -140,6 +140,7 @@ func ModbusPDUReadFileRecordRequestParse(io 
utils.ReadBuffer) (*ModbusPDU, error
                }
                items = append(items, _item)
        }
+       io.CloseContext("items")
 
        io.CloseContext("ModbusPDUReadFileRecordRequest")
 
diff --git 
a/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadFileRecordResponse.go
 
b/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadFileRecordResponse.go
index 2e5f7d6..1a8495d 100644
--- 
a/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadFileRecordResponse.go
+++ 
b/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadFileRecordResponse.go
@@ -140,6 +140,7 @@ func ModbusPDUReadFileRecordResponseParse(io 
utils.ReadBuffer) (*ModbusPDU, erro
                }
                items = append(items, _item)
        }
+       io.CloseContext("items")
 
        io.CloseContext("ModbusPDUReadFileRecordResponse")
 
diff --git 
a/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadFileRecordResponseItem.go
 
b/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadFileRecordResponseItem.go
index ffdcc47..d076978 100644
--- 
a/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadFileRecordResponseItem.go
+++ 
b/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadFileRecordResponseItem.go
@@ -120,6 +120,7 @@ func ModbusPDUReadFileRecordResponseItemParse(io 
utils.ReadBuffer) (*ModbusPDURe
                }
                data = append(data, _item)
        }
+       io.CloseContext("data")
 
        io.CloseContext("ModbusPDUReadFileRecordResponseItem")
 
diff --git 
a/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadHoldingRegistersResponse.go
 
b/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadHoldingRegistersResponse.go
index 3ea4d7e..0a822ac 100644
--- 
a/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadHoldingRegistersResponse.go
+++ 
b/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadHoldingRegistersResponse.go
@@ -138,6 +138,7 @@ func ModbusPDUReadHoldingRegistersResponseParse(io 
utils.ReadBuffer) (*ModbusPDU
                }
                value[curItem] = _item
        }
+       io.CloseContext("value")
 
        io.CloseContext("ModbusPDUReadHoldingRegistersResponse")
 
diff --git 
a/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadInputRegistersResponse.go
 
b/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadInputRegistersResponse.go
index c8b937d..3cd1e54 100644
--- 
a/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadInputRegistersResponse.go
+++ 
b/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadInputRegistersResponse.go
@@ -138,6 +138,7 @@ func ModbusPDUReadInputRegistersResponseParse(io 
utils.ReadBuffer) (*ModbusPDU,
                }
                value[curItem] = _item
        }
+       io.CloseContext("value")
 
        io.CloseContext("ModbusPDUReadInputRegistersResponse")
 
diff --git 
a/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadWriteMultipleHoldingRegistersRequest.go
 
b/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadWriteMultipleHoldingRegistersRequest.go
index 0f9ce8e..8d89511 100644
--- 
a/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadWriteMultipleHoldingRegistersRequest.go
+++ 
b/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadWriteMultipleHoldingRegistersRequest.go
@@ -182,6 +182,7 @@ func 
ModbusPDUReadWriteMultipleHoldingRegistersRequestParse(io utils.ReadBuffer)
                }
                value[curItem] = _item
        }
+       io.CloseContext("value")
 
        io.CloseContext("ModbusPDUReadWriteMultipleHoldingRegistersRequest")
 
diff --git 
a/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadWriteMultipleHoldingRegistersResponse.go
 
b/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadWriteMultipleHoldingRegistersResponse.go
index 9631a12..8c12b8b 100644
--- 
a/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadWriteMultipleHoldingRegistersResponse.go
+++ 
b/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadWriteMultipleHoldingRegistersResponse.go
@@ -138,6 +138,7 @@ func 
ModbusPDUReadWriteMultipleHoldingRegistersResponseParse(io utils.ReadBuffer
                }
                value[curItem] = _item
        }
+       io.CloseContext("value")
 
        io.CloseContext("ModbusPDUReadWriteMultipleHoldingRegistersResponse")
 
diff --git 
a/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReportServerIdResponse.go
 
b/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReportServerIdResponse.go
index 95e0aa3..708f74f 100644
--- 
a/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReportServerIdResponse.go
+++ 
b/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReportServerIdResponse.go
@@ -138,6 +138,7 @@ func ModbusPDUReportServerIdResponseParse(io 
utils.ReadBuffer) (*ModbusPDU, erro
                }
                value[curItem] = _item
        }
+       io.CloseContext("value")
 
        io.CloseContext("ModbusPDUReportServerIdResponse")
 
diff --git 
a/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteFileRecordRequest.go
 
b/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteFileRecordRequest.go
index 0afe1af..499cbc1 100644
--- 
a/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteFileRecordRequest.go
+++ 
b/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteFileRecordRequest.go
@@ -140,6 +140,7 @@ func ModbusPDUWriteFileRecordRequestParse(io 
utils.ReadBuffer) (*ModbusPDU, erro
                }
                items = append(items, _item)
        }
+       io.CloseContext("items")
 
        io.CloseContext("ModbusPDUWriteFileRecordRequest")
 
diff --git 
a/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteFileRecordRequestItem.go
 
b/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteFileRecordRequestItem.go
index d3a6330..1d29387 100644
--- 
a/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteFileRecordRequestItem.go
+++ 
b/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteFileRecordRequestItem.go
@@ -140,6 +140,7 @@ func ModbusPDUWriteFileRecordRequestItemParse(io 
utils.ReadBuffer) (*ModbusPDUWr
                }
                recordData = append(recordData, _item)
        }
+       io.CloseContext("recordData")
 
        io.CloseContext("ModbusPDUWriteFileRecordRequestItem")
 
diff --git 
a/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteFileRecordResponse.go
 
b/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteFileRecordResponse.go
index 2cd013a..da19783 100644
--- 
a/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteFileRecordResponse.go
+++ 
b/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteFileRecordResponse.go
@@ -140,6 +140,7 @@ func ModbusPDUWriteFileRecordResponseParse(io 
utils.ReadBuffer) (*ModbusPDU, err
                }
                items = append(items, _item)
        }
+       io.CloseContext("items")
 
        io.CloseContext("ModbusPDUWriteFileRecordResponse")
 
diff --git 
a/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteFileRecordResponseItem.go
 
b/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteFileRecordResponseItem.go
index 2dfe301..f22ec7f 100644
--- 
a/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteFileRecordResponseItem.go
+++ 
b/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteFileRecordResponseItem.go
@@ -140,6 +140,7 @@ func ModbusPDUWriteFileRecordResponseItemParse(io 
utils.ReadBuffer) (*ModbusPDUW
                }
                recordData = append(recordData, _item)
        }
+       io.CloseContext("recordData")
 
        io.CloseContext("ModbusPDUWriteFileRecordResponseItem")
 
diff --git 
a/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteMultipleCoilsRequest.go
 
b/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteMultipleCoilsRequest.go
index c8360e5..34a6aad 100644
--- 
a/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteMultipleCoilsRequest.go
+++ 
b/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteMultipleCoilsRequest.go
@@ -160,6 +160,7 @@ func ModbusPDUWriteMultipleCoilsRequestParse(io 
utils.ReadBuffer) (*ModbusPDU, e
                }
                value[curItem] = _item
        }
+       io.CloseContext("value")
 
        io.CloseContext("ModbusPDUWriteMultipleCoilsRequest")
 
diff --git 
a/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteMultipleHoldingRegistersRequest.go
 
b/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteMultipleHoldingRegistersRequest.go
index c96391c..bd345fd 100644
--- 
a/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteMultipleHoldingRegistersRequest.go
+++ 
b/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteMultipleHoldingRegistersRequest.go
@@ -160,6 +160,7 @@ func ModbusPDUWriteMultipleHoldingRegistersRequestParse(io 
utils.ReadBuffer) (*M
                }
                value[curItem] = _item
        }
+       io.CloseContext("value")
 
        io.CloseContext("ModbusPDUWriteMultipleHoldingRegistersRequest")
 
diff --git a/plc4go/internal/plc4go/s7/readwrite/model/COTPPacket.go 
b/plc4go/internal/plc4go/s7/readwrite/model/COTPPacket.go
index 54cc561..b2c612a 100644
--- a/plc4go/internal/plc4go/s7/readwrite/model/COTPPacket.go
+++ b/plc4go/internal/plc4go/s7/readwrite/model/COTPPacket.go
@@ -173,6 +173,7 @@ func COTPPacketParse(io utils.ReadBuffer, cotpLen uint16) 
(*COTPPacket, error) {
                parameters = append(parameters, _item)
                curPos = io.GetPos() - startPos
        }
+       io.CloseContext("parameters")
 
        // Optional Field (payload) (Can be skipped, if a given expression 
evaluates to false)
        curPos = io.GetPos() - startPos
diff --git 
a/plc4go/internal/plc4go/s7/readwrite/model/COTPParameterDisconnectAdditionalInformation.go
 
b/plc4go/internal/plc4go/s7/readwrite/model/COTPParameterDisconnectAdditionalInformation.go
index 1f8ef5c..0cd6881 100644
--- 
a/plc4go/internal/plc4go/s7/readwrite/model/COTPParameterDisconnectAdditionalInformation.go
+++ 
b/plc4go/internal/plc4go/s7/readwrite/model/COTPParameterDisconnectAdditionalInformation.go
@@ -118,6 +118,7 @@ func COTPParameterDisconnectAdditionalInformationParse(io 
utils.ReadBuffer, rest
                }
                data[curItem] = _item
        }
+       io.CloseContext("data")
 
        io.CloseContext("COTPParameterDisconnectAdditionalInformation")
 
diff --git 
a/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterReadVarRequest.go 
b/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterReadVarRequest.go
index 246dcc5..7858c26 100644
--- a/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterReadVarRequest.go
+++ b/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterReadVarRequest.go
@@ -135,6 +135,7 @@ func S7ParameterReadVarRequestParse(io utils.ReadBuffer) 
(*S7Parameter, error) {
                }
                items[curItem] = _item
        }
+       io.CloseContext("items")
 
        io.CloseContext("S7ParameterReadVarRequest")
 
diff --git a/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterUserData.go 
b/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterUserData.go
index 6de78ce..1cf297e 100644
--- a/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterUserData.go
+++ b/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterUserData.go
@@ -135,6 +135,7 @@ func S7ParameterUserDataParse(io utils.ReadBuffer) 
(*S7Parameter, error) {
                }
                items[curItem] = _item
        }
+       io.CloseContext("items")
 
        io.CloseContext("S7ParameterUserData")
 
diff --git 
a/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterWriteVarRequest.go 
b/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterWriteVarRequest.go
index 1d42746..7ea4e5c 100644
--- a/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterWriteVarRequest.go
+++ b/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterWriteVarRequest.go
@@ -135,6 +135,7 @@ func S7ParameterWriteVarRequestParse(io utils.ReadBuffer) 
(*S7Parameter, error)
                }
                items[curItem] = _item
        }
+       io.CloseContext("items")
 
        io.CloseContext("S7ParameterWriteVarRequest")
 
diff --git 
a/plc4go/internal/plc4go/s7/readwrite/model/S7PayloadReadVarResponse.go 
b/plc4go/internal/plc4go/s7/readwrite/model/S7PayloadReadVarResponse.go
index a649b25..aef21d1 100644
--- a/plc4go/internal/plc4go/s7/readwrite/model/S7PayloadReadVarResponse.go
+++ b/plc4go/internal/plc4go/s7/readwrite/model/S7PayloadReadVarResponse.go
@@ -126,6 +126,7 @@ func S7PayloadReadVarResponseParse(io utils.ReadBuffer, 
parameter *S7Parameter)
                }
                items[curItem] = _item
        }
+       io.CloseContext("items")
 
        io.CloseContext("S7PayloadReadVarResponse")
 
diff --git a/plc4go/internal/plc4go/s7/readwrite/model/S7PayloadUserData.go 
b/plc4go/internal/plc4go/s7/readwrite/model/S7PayloadUserData.go
index 12e060f..bcc7e6d 100644
--- a/plc4go/internal/plc4go/s7/readwrite/model/S7PayloadUserData.go
+++ b/plc4go/internal/plc4go/s7/readwrite/model/S7PayloadUserData.go
@@ -125,6 +125,7 @@ func S7PayloadUserDataParse(io utils.ReadBuffer, parameter 
*S7Parameter) (*S7Pay
                }
                items[curItem] = _item
        }
+       io.CloseContext("items")
 
        io.CloseContext("S7PayloadUserData")
 
diff --git 
a/plc4go/internal/plc4go/s7/readwrite/model/S7PayloadUserDataItemCpuFunctionReadSzlResponse.go
 
b/plc4go/internal/plc4go/s7/readwrite/model/S7PayloadUserDataItemCpuFunctionReadSzlResponse.go
index b510456..5fcf90e 100644
--- 
a/plc4go/internal/plc4go/s7/readwrite/model/S7PayloadUserDataItemCpuFunctionReadSzlResponse.go
+++ 
b/plc4go/internal/plc4go/s7/readwrite/model/S7PayloadUserDataItemCpuFunctionReadSzlResponse.go
@@ -151,6 +151,7 @@ func 
S7PayloadUserDataItemCpuFunctionReadSzlResponseParse(io utils.ReadBuffer) (
                }
                items[curItem] = _item
        }
+       io.CloseContext("items")
 
        io.CloseContext("S7PayloadUserDataItemCpuFunctionReadSzlResponse")
 
diff --git 
a/plc4go/internal/plc4go/s7/readwrite/model/S7PayloadWriteVarRequest.go 
b/plc4go/internal/plc4go/s7/readwrite/model/S7PayloadWriteVarRequest.go
index 7c969a6..d9f14ef 100644
--- a/plc4go/internal/plc4go/s7/readwrite/model/S7PayloadWriteVarRequest.go
+++ b/plc4go/internal/plc4go/s7/readwrite/model/S7PayloadWriteVarRequest.go
@@ -126,6 +126,7 @@ func S7PayloadWriteVarRequestParse(io utils.ReadBuffer, 
parameter *S7Parameter)
                }
                items[curItem] = _item
        }
+       io.CloseContext("items")
 
        io.CloseContext("S7PayloadWriteVarRequest")
 
diff --git 
a/plc4go/internal/plc4go/s7/readwrite/model/S7PayloadWriteVarResponse.go 
b/plc4go/internal/plc4go/s7/readwrite/model/S7PayloadWriteVarResponse.go
index 33c0e48..5662097 100644
--- a/plc4go/internal/plc4go/s7/readwrite/model/S7PayloadWriteVarResponse.go
+++ b/plc4go/internal/plc4go/s7/readwrite/model/S7PayloadWriteVarResponse.go
@@ -125,6 +125,7 @@ func S7PayloadWriteVarResponseParse(io utils.ReadBuffer, 
parameter *S7Parameter)
                }
                items[curItem] = _item
        }
+       io.CloseContext("items")
 
        io.CloseContext("S7PayloadWriteVarResponse")
 
diff --git a/plc4go/internal/plc4go/s7/readwrite/model/S7VarPayloadDataItem.go 
b/plc4go/internal/plc4go/s7/readwrite/model/S7VarPayloadDataItem.go
index 463be68..25abbcc 100644
--- a/plc4go/internal/plc4go/s7/readwrite/model/S7VarPayloadDataItem.go
+++ b/plc4go/internal/plc4go/s7/readwrite/model/S7VarPayloadDataItem.go
@@ -135,6 +135,7 @@ func S7VarPayloadDataItemParse(io utils.ReadBuffer, 
lastItem bool) (*S7VarPayloa
                }
                data[curItem] = _item
        }
+       io.CloseContext("data")
 
        // Padding Field (padding)
        {
diff --git a/plc4go/internal/plc4go/s7/readwrite/model/SzlDataTreeItem.go 
b/plc4go/internal/plc4go/s7/readwrite/model/SzlDataTreeItem.go
index dcd0e8b..beb073b 100644
--- a/plc4go/internal/plc4go/s7/readwrite/model/SzlDataTreeItem.go
+++ b/plc4go/internal/plc4go/s7/readwrite/model/SzlDataTreeItem.go
@@ -120,6 +120,7 @@ func SzlDataTreeItemParse(io utils.ReadBuffer) 
(*SzlDataTreeItem, error) {
                }
                mlfb[curItem] = _item
        }
+       io.CloseContext("mlfb")
 
        // Simple Field (moduleTypeId)
        moduleTypeId, _moduleTypeIdErr := io.ReadUint16("moduleTypeId", 16)
diff --git a/plc4go/internal/plc4go/s7/s7Io_test.go 
b/plc4go/internal/plc4go/s7/s7Io_test.go
index 6577994..124fd66 100644
--- a/plc4go/internal/plc4go/s7/s7Io_test.go
+++ b/plc4go/internal/plc4go/s7/s7Io_test.go
@@ -57,7 +57,7 @@ func TestS7MessageBytes(t *testing.T) {
                                                        0,
                                                        0,
                                                        11,
-                                                       
model.NewS7ParameterReadVarResponse(4),
+                                                       
model.NewS7ParameterReadVarResponse(1),
                                                        
model.NewS7PayloadReadVarResponse(
                                                                
[]*model.S7VarPayloadDataItem{
                                                                        
model.NewS7VarPayloadDataItem(
@@ -90,7 +90,7 @@ func TestS7MessageBytes(t *testing.T) {
 
║║║╚═══════════╝╚════════════╝╚═════════╝╚══════════════╝╚════════════════╝╚══════════════╝╚═══════════╝╚══════════╝║║║
 ║║║╔═S7Parameter/S7ParameterReadVarResponse/parameter╗                         
                                     ║║║
 ║║║║           ╔═ParameterType╗╔═NumItems╗           ║                         
                                     ║║║
-║║║║           ║    0x04 4    ║║ 0x04 4  ║           ║                         
                                     ║║║
+║║║║           ║    0x04 4    ║║ 0x01 1  ║           ║                         
                                     ║║║
 ║║║║           ╚══════════════╝╚═════════╝           ║                         
                                     ║║║
 ║║║╚═════════════════════════════════════════════════╝                         
                                     ║║║
 
║║║╔═S7Payload/S7PayloadReadVarResponse/payload════════════════════════════════════════════════════════════════╗
    ║║║
@@ -130,7 +130,7 @@ func TestS7MessageBytes(t *testing.T) {
 ║║║╔═S7MessageResponseData═══╗╔═S7Parameter═════════════════════════════════╗  
            ║                    ║║
 ║║║║╔═errorClass╗╔═errorCode╗║║╔═parameterType╗╔═S7ParameterReadVarResponse╗║  
            ║                    ║║
 ║║║║║  0x00 0   ║║  0x00 0  ║║║║    0x04 4    ║║        ╔═numItems╗        ║║  
            ║                    ║║
-║║║║╚═══════════╝╚══════════╝║║╚══════════════╝║        ║ 0x04 4  ║        ║║  
            ║                    ║║
+║║║║╚═══════════╝╚══════════╝║║╚══════════════╝║        ║ 0x01 1  ║        ║║  
            ║                    ║║
 ║║║╚═════════════════════════╝║                ║        ╚═════════╝        ║║  
            ║                    ║║
 ║║║                           ║                ╚═══════════════════════════╝║  
            ║                    ║║
 ║║║                           ╚═════════════════════════════════════════════╝  
            ║                    ║║
@@ -186,7 +186,7 @@ func TestS7MessageBytes(t *testing.T) {
       <S7Parameter>
         <parameterType dataType="uint8" bitLength="8">4</parameterType>
         <S7ParameterReadVarResponse>
-          <numItems dataType="uint8" bitLength="8">4</numItems>
+          <numItems dataType="uint8" bitLength="8">1</numItems>
         </S7ParameterReadVarResponse>
       </S7Parameter>
       <S7Payload>
@@ -211,7 +211,7 @@ func TestS7MessageBytes(t *testing.T) {
                        wantDump: `
 00|03 00 00 1d 05 f0 0d c0 01 0c '..........'
 10|32 03 00 00 00 0b 00 02 00 05 '2.........'
-20|00 00 04 04 ff 03 00 01 01    '......... '
+20|00 00 04 01 ff 03 00 01 01    '......... '
 `,
                },
        }
@@ -245,6 +245,16 @@ func TestS7MessageBytes(t *testing.T) {
                        if got := utils.Dump(buffer.GetBytes()); 
!reflect.DeepEqual(got, tt.wantDump) {
                                t.Errorf("Serialize() = '\n%v\n', want 
'\n%v\n'", got, tt.wantDump)
                        }
+                       // and at least a roundtip
+                       reader := strings.NewReader(tt.wantStringXml)
+                       readBuffer := utils.NewXmlReadBuffer(reader)
+                       if got, err := model.TPKTPacketParse(readBuffer); err 
!= nil || !reflect.DeepEqual(got, tt.args.debuggable) {
+                               if err != nil {
+                                       t.Error(err)
+                               } else {
+                                       t.Errorf("Roundtrip = '\n%v\n', want 
'\n%v\n'", got, tt.wantDump)
+                               }
+                       }
                })
        }
 }
diff --git a/plc4go/internal/plc4go/spi/utils/ReadBufferByteBased.go 
b/plc4go/internal/plc4go/spi/utils/ReadBufferByteBased.go
index 6dd15e9..6995536 100644
--- a/plc4go/internal/plc4go/spi/utils/ReadBufferByteBased.go
+++ b/plc4go/internal/plc4go/spi/utils/ReadBufferByteBased.go
@@ -31,7 +31,7 @@ import (
 func NewReadBuffer(data []uint8) ReadBuffer {
        buffer := bytes.NewBuffer(data)
        reader := bitio.NewReader(buffer)
-       return &readBuffer{
+       return &byteReadBuffer{
                data:      data,
                reader:    reader,
                pos:       uint64(0),
@@ -42,7 +42,7 @@ func NewReadBuffer(data []uint8) ReadBuffer {
 func NewLittleEndianReadBuffer(data []uint8) ReadBuffer {
        buffer := bytes.NewBuffer(data)
        reader := bitio.NewReader(buffer)
-       return &readBuffer{
+       return &byteReadBuffer{
                data:      data,
                reader:    reader,
                pos:       uint64(0),
@@ -56,7 +56,7 @@ func NewLittleEndianReadBuffer(data []uint8) ReadBuffer {
 // Internal section
 //
 
-type readBuffer struct {
+type byteReadBuffer struct {
        data      []uint8
        reader    *bitio.Reader
        pos       uint64
@@ -69,41 +69,41 @@ type readBuffer struct {
 ///////////////////////////////////////
 ///////////////////////////////////////
 
-func (rb *readBuffer) Reset() {
+func (rb *byteReadBuffer) Reset() {
        rb.pos = uint64(0)
        rb.reader = bitio.NewReader(bytes.NewBuffer(rb.data))
 }
 
-func (rb *readBuffer) GetPos() uint16 {
+func (rb *byteReadBuffer) GetPos() uint16 {
        return uint16(rb.pos / 8)
 }
 
-func (rb *readBuffer) GetBytes() []uint8 {
+func (rb *byteReadBuffer) GetBytes() []uint8 {
        return rb.data
 }
 
-func (rb *readBuffer) GetTotalBytes() uint64 {
+func (rb *byteReadBuffer) GetTotalBytes() uint64 {
        return uint64(len(rb.data))
 }
 
-func (rb *readBuffer) HasMore(bitLength uint8) bool {
+func (rb *byteReadBuffer) HasMore(bitLength uint8) bool {
        return (rb.pos + uint64(bitLength)) <= (uint64(len(rb.data)) * 8)
 }
 
-func (rb *readBuffer) PeekByte(offset uint8) uint8 {
+func (rb *byteReadBuffer) PeekByte(offset uint8) uint8 {
        return rb.data[rb.pos+uint64(offset)]
 }
 
-func (rb *readBuffer) PullContext(_ string, _ ...WithReaderArgs) error {
+func (rb *byteReadBuffer) PullContext(_ string, _ ...WithReaderArgs) error {
        return nil
 }
 
-func (rb *readBuffer) ReadBit(_ string, _ ...WithReaderArgs) (bool, error) {
+func (rb *byteReadBuffer) ReadBit(_ string, _ ...WithReaderArgs) (bool, error) 
{
        rb.pos += 1
        return rb.reader.ReadBool()
 }
 
-func (rb *readBuffer) ReadUint8(_ string, bitLength uint8, _ 
...WithReaderArgs) (uint8, error) {
+func (rb *byteReadBuffer) ReadUint8(_ string, bitLength uint8, _ 
...WithReaderArgs) (uint8, error) {
        rb.pos += uint64(bitLength)
        res := uint8(rb.reader.TryReadBits(bitLength))
        if rb.reader.TryError != nil {
@@ -112,7 +112,7 @@ func (rb *readBuffer) ReadUint8(_ string, bitLength uint8, 
_ ...WithReaderArgs)
        return res, nil
 }
 
-func (rb *readBuffer) ReadUint16(logicalName string, bitLength uint8, _ 
...WithReaderArgs) (uint16, error) {
+func (rb *byteReadBuffer) ReadUint16(logicalName string, bitLength uint8, _ 
...WithReaderArgs) (uint16, error) {
        if rb.byteOrder == binary.LittleEndian {
                // TODO: indirection till we have a native LE implementation
                bigInt, err := rb.ReadBigInt(logicalName, uint64(bitLength))
@@ -129,7 +129,7 @@ func (rb *readBuffer) ReadUint16(logicalName string, 
bitLength uint8, _ ...WithR
        return res, nil
 }
 
-func (rb *readBuffer) ReadUint32(logicalName string, bitLength uint8, _ 
...WithReaderArgs) (uint32, error) {
+func (rb *byteReadBuffer) ReadUint32(logicalName string, bitLength uint8, _ 
...WithReaderArgs) (uint32, error) {
        if rb.byteOrder == binary.LittleEndian {
                // TODO: indirection till we have a native LE implementation
                bigInt, err := rb.ReadBigInt(logicalName, uint64(bitLength))
@@ -146,7 +146,7 @@ func (rb *readBuffer) ReadUint32(logicalName string, 
bitLength uint8, _ ...WithR
        return res, nil
 }
 
-func (rb *readBuffer) ReadUint64(logicalName string, bitLength uint8, _ 
...WithReaderArgs) (uint64, error) {
+func (rb *byteReadBuffer) ReadUint64(logicalName string, bitLength uint8, _ 
...WithReaderArgs) (uint64, error) {
        if rb.byteOrder == binary.LittleEndian {
                // TODO: indirection till we have a native LE implementation
                bigInt, err := rb.ReadBigInt(logicalName, uint64(bitLength))
@@ -163,7 +163,7 @@ func (rb *readBuffer) ReadUint64(logicalName string, 
bitLength uint8, _ ...WithR
        return res, nil
 }
 
-func (rb *readBuffer) ReadInt8(_ string, bitLength uint8, _ ...WithReaderArgs) 
(int8, error) {
+func (rb *byteReadBuffer) ReadInt8(_ string, bitLength uint8, _ 
...WithReaderArgs) (int8, error) {
        rb.pos += uint64(bitLength)
        res := int8(rb.reader.TryReadBits(bitLength))
        if rb.reader.TryError != nil {
@@ -172,7 +172,7 @@ func (rb *readBuffer) ReadInt8(_ string, bitLength uint8, _ 
...WithReaderArgs) (
        return res, nil
 }
 
-func (rb *readBuffer) ReadInt16(logicalName string, bitLength uint8, _ 
...WithReaderArgs) (int16, error) {
+func (rb *byteReadBuffer) ReadInt16(logicalName string, bitLength uint8, _ 
...WithReaderArgs) (int16, error) {
        if rb.byteOrder == binary.LittleEndian {
                // TODO: indirection till we have a native LE implementation
                bigInt, err := rb.ReadBigInt(logicalName, uint64(bitLength))
@@ -189,7 +189,7 @@ func (rb *readBuffer) ReadInt16(logicalName string, 
bitLength uint8, _ ...WithRe
        return res, nil
 }
 
-func (rb *readBuffer) ReadInt32(logicalName string, bitLength uint8, _ 
...WithReaderArgs) (int32, error) {
+func (rb *byteReadBuffer) ReadInt32(logicalName string, bitLength uint8, _ 
...WithReaderArgs) (int32, error) {
        if rb.byteOrder == binary.LittleEndian {
                // TODO: indirection till we have a native LE implementation
                bigInt, err := rb.ReadBigInt(logicalName, uint64(bitLength))
@@ -206,7 +206,7 @@ func (rb *readBuffer) ReadInt32(logicalName string, 
bitLength uint8, _ ...WithRe
        return res, nil
 }
 
-func (rb *readBuffer) ReadInt64(logicalName string, bitLength uint8, _ 
...WithReaderArgs) (int64, error) {
+func (rb *byteReadBuffer) ReadInt64(logicalName string, bitLength uint8, _ 
...WithReaderArgs) (int64, error) {
        if rb.byteOrder == binary.LittleEndian {
                // TODO: indirection till we have a native LE implementation
                bigInt, err := rb.ReadBigInt(logicalName, uint64(bitLength))
@@ -223,7 +223,7 @@ func (rb *readBuffer) ReadInt64(logicalName string, 
bitLength uint8, _ ...WithRe
        return res, nil
 }
 
-func (rb *readBuffer) ReadBigInt(_ string, bitLength uint64, _ 
...WithReaderArgs) (*big.Int, error) {
+func (rb *byteReadBuffer) ReadBigInt(_ string, bitLength uint64, _ 
...WithReaderArgs) (*big.Int, error) {
        // TODO: highly experimental remove this comment when tested or verifyed
        res := big.NewInt(0)
 
@@ -274,7 +274,7 @@ func (rb *readBuffer) ReadBigInt(_ string, bitLength 
uint64, _ ...WithReaderArgs
        return res, nil
 }
 
-func (rb *readBuffer) ReadFloat32(logicalName string, signed bool, 
exponentBitLength uint8, mantissaBitLength uint8, _ ...WithReaderArgs) 
(float32, error) {
+func (rb *byteReadBuffer) ReadFloat32(logicalName string, signed bool, 
exponentBitLength uint8, mantissaBitLength uint8, _ ...WithReaderArgs) 
(float32, error) {
        if rb.byteOrder == binary.LittleEndian {
                // TODO: indirection till we have a native LE implementation
                bigInt, err := rb.ReadBigFloat(logicalName, signed, 
exponentBitLength, mantissaBitLength)
@@ -322,7 +322,7 @@ func (rb *readBuffer) ReadFloat32(logicalName string, 
signed bool, exponentBitLe
        }
 }
 
-func (rb *readBuffer) ReadFloat64(_ string, _ bool, exponentBitLength uint8, 
mantissaBitLength uint8, _ ...WithReaderArgs) (float64, error) {
+func (rb *byteReadBuffer) ReadFloat64(_ string, _ bool, exponentBitLength 
uint8, mantissaBitLength uint8, _ ...WithReaderArgs) (float64, error) {
        bitLength := 1 + exponentBitLength + mantissaBitLength
        rb.pos += uint64(bitLength)
        uintValue := rb.reader.TryReadBits(bitLength)
@@ -338,7 +338,7 @@ func (rb *readBuffer) ReadFloat64(_ string, _ bool, 
exponentBitLength uint8, man
        return res, nil
 }
 
-func (rb *readBuffer) ReadBigFloat(logicalName string, signed bool, 
exponentBitLength uint8, mantissaBitLength uint8, _ ...WithReaderArgs) 
(*big.Float, error) {
+func (rb *byteReadBuffer) ReadBigFloat(logicalName string, signed bool, 
exponentBitLength uint8, mantissaBitLength uint8, _ ...WithReaderArgs) 
(*big.Float, error) {
        readFloat64, err := rb.ReadFloat64(logicalName, signed, 
exponentBitLength, mantissaBitLength)
        if err != nil {
                return nil, errors.Wrap(err, "Error reading float64")
@@ -346,7 +346,7 @@ func (rb *readBuffer) ReadBigFloat(logicalName string, 
signed bool, exponentBitL
        return big.NewFloat(readFloat64), nil
 }
 
-func (rb *readBuffer) ReadString(logicalName string, bitLength uint32, _ 
...WithReaderArgs) (string, error) {
+func (rb *byteReadBuffer) ReadString(logicalName string, bitLength uint32, _ 
...WithReaderArgs) (string, error) {
        bigInt, err := rb.ReadBigInt(logicalName, uint64(bitLength))
        if err != nil {
                return "", errors.Wrap(err, "Error reading big int")
@@ -354,6 +354,6 @@ func (rb *readBuffer) ReadString(logicalName string, 
bitLength uint32, _ ...With
        return string(bigInt.Bytes()), nil
 }
 
-func (rb *readBuffer) CloseContext(_ string, _ ...WithReaderArgs) error {
+func (rb *byteReadBuffer) CloseContext(_ string, _ ...WithReaderArgs) error {
        return nil
 }
diff --git a/plc4go/internal/plc4go/spi/utils/ReadBufferByteBased_test.go 
b/plc4go/internal/plc4go/spi/utils/ReadBufferByteBased_test.go
index 729e93e..f59c43c 100644
--- a/plc4go/internal/plc4go/spi/utils/ReadBufferByteBased_test.go
+++ b/plc4go/internal/plc4go/spi/utils/ReadBufferByteBased_test.go
@@ -84,7 +84,7 @@ func TestReadBuffer_GetBytes(t *testing.T) {
        }
        for _, tt := range tests {
                t.Run(tt.name, func(t *testing.T) {
-                       rb := &readBuffer{
+                       rb := &byteReadBuffer{
                                data:      tt.fields.data,
                                reader:    tt.fields.reader,
                                pos:       tt.fields.pos,
@@ -113,7 +113,7 @@ func TestReadBuffer_GetPos(t *testing.T) {
        }
        for _, tt := range tests {
                t.Run(tt.name, func(t *testing.T) {
-                       rb := &readBuffer{
+                       rb := &byteReadBuffer{
                                data:      tt.fields.data,
                                reader:    tt.fields.reader,
                                pos:       tt.fields.pos,
@@ -142,7 +142,7 @@ func TestReadBuffer_GetTotalBytes(t *testing.T) {
        }
        for _, tt := range tests {
                t.Run(tt.name, func(t *testing.T) {
-                       rb := &readBuffer{
+                       rb := &byteReadBuffer{
                                data:      tt.fields.data,
                                reader:    tt.fields.reader,
                                pos:       tt.fields.pos,
@@ -175,7 +175,7 @@ func TestReadBuffer_HasMore(t *testing.T) {
        }
        for _, tt := range tests {
                t.Run(tt.name, func(t *testing.T) {
-                       rb := &readBuffer{
+                       rb := &byteReadBuffer{
                                data:      tt.fields.data,
                                reader:    tt.fields.reader,
                                pos:       tt.fields.pos,
@@ -208,7 +208,7 @@ func TestReadBuffer_PeekByte(t *testing.T) {
        }
        for _, tt := range tests {
                t.Run(tt.name, func(t *testing.T) {
-                       rb := &readBuffer{
+                       rb := &byteReadBuffer{
                                data:      tt.fields.data,
                                reader:    tt.fields.reader,
                                pos:       tt.fields.pos,
@@ -244,7 +244,7 @@ func TestReadBuffer_ReadBigFloat(t *testing.T) {
        }
        for _, tt := range tests {
                t.Run(tt.name, func(t *testing.T) {
-                       rb := &readBuffer{
+                       rb := &byteReadBuffer{
                                data:      tt.fields.data,
                                reader:    tt.fields.reader,
                                pos:       tt.fields.pos,
@@ -283,7 +283,7 @@ func TestReadBuffer_ReadBigInt(t *testing.T) {
        }
        for _, tt := range tests {
                t.Run(tt.name, func(t *testing.T) {
-                       rb := &readBuffer{
+                       rb := &byteReadBuffer{
                                data:      tt.fields.data,
                                reader:    tt.fields.reader,
                                pos:       tt.fields.pos,
@@ -318,7 +318,7 @@ func TestReadBuffer_ReadBit(t *testing.T) {
        }
        for _, tt := range tests {
                t.Run(tt.name, func(t *testing.T) {
-                       rb := &readBuffer{
+                       rb := &byteReadBuffer{
                                data:      tt.fields.data,
                                reader:    tt.fields.reader,
                                pos:       tt.fields.pos,
@@ -359,7 +359,7 @@ func TestReadBuffer_ReadFloat32(t *testing.T) {
        }
        for _, tt := range tests {
                t.Run(tt.name, func(t *testing.T) {
-                       rb := &readBuffer{
+                       rb := &byteReadBuffer{
                                data:      tt.fields.data,
                                reader:    tt.fields.reader,
                                pos:       tt.fields.pos,
@@ -411,10 +411,10 @@ func TestReadBuffer_ReadFloat64(t *testing.T) {
                                binary.BigEndian.PutUint64(rawData, 
0b0_01111111111_0000000000000000000000000000000000000000000000000000)
                                buffer := NewReadBuffer(rawData)
                                return fields{
-                                       data:      buffer.(*readBuffer).data,
-                                       reader:    buffer.(*readBuffer).reader,
-                                       pos:       buffer.(*readBuffer).pos,
-                                       byteOrder: 
buffer.(*readBuffer).byteOrder,
+                                       data:      
buffer.(*byteReadBuffer).data,
+                                       reader:    
buffer.(*byteReadBuffer).reader,
+                                       pos:       buffer.(*byteReadBuffer).pos,
+                                       byteOrder: 
buffer.(*byteReadBuffer).byteOrder,
                                }
                        }(),
                        args: args{
@@ -432,10 +432,10 @@ func TestReadBuffer_ReadFloat64(t *testing.T) {
                                binary.LittleEndian.PutUint64(rawData, 
0b0_01111111111_0000000000000000000000000000000000000000000000000000)
                                buffer := NewLittleEndianReadBuffer(rawData)
                                return fields{
-                                       data:      buffer.(*readBuffer).data,
-                                       reader:    buffer.(*readBuffer).reader,
-                                       pos:       buffer.(*readBuffer).pos,
-                                       byteOrder: 
buffer.(*readBuffer).byteOrder,
+                                       data:      
buffer.(*byteReadBuffer).data,
+                                       reader:    
buffer.(*byteReadBuffer).reader,
+                                       pos:       buffer.(*byteReadBuffer).pos,
+                                       byteOrder: 
buffer.(*byteReadBuffer).byteOrder,
                                }
                        }(),
                        args: args{
@@ -453,10 +453,10 @@ func TestReadBuffer_ReadFloat64(t *testing.T) {
                                binary.BigEndian.PutUint64(rawData, 
0b0_01111111111_0000000000000000000000000000000000000000000000000001)
                                buffer := NewReadBuffer(rawData)
                                return fields{
-                                       data:      buffer.(*readBuffer).data,
-                                       reader:    buffer.(*readBuffer).reader,
-                                       pos:       buffer.(*readBuffer).pos,
-                                       byteOrder: 
buffer.(*readBuffer).byteOrder,
+                                       data:      
buffer.(*byteReadBuffer).data,
+                                       reader:    
buffer.(*byteReadBuffer).reader,
+                                       pos:       buffer.(*byteReadBuffer).pos,
+                                       byteOrder: 
buffer.(*byteReadBuffer).byteOrder,
                                }
                        }(),
                        args: args{
@@ -474,10 +474,10 @@ func TestReadBuffer_ReadFloat64(t *testing.T) {
                                binary.LittleEndian.PutUint64(rawData, 
0b0_01111111111_0000000000000000000000000000000000000000000000000001)
                                buffer := NewLittleEndianReadBuffer(rawData)
                                return fields{
-                                       data:      buffer.(*readBuffer).data,
-                                       reader:    buffer.(*readBuffer).reader,
-                                       pos:       buffer.(*readBuffer).pos,
-                                       byteOrder: 
buffer.(*readBuffer).byteOrder,
+                                       data:      
buffer.(*byteReadBuffer).data,
+                                       reader:    
buffer.(*byteReadBuffer).reader,
+                                       pos:       buffer.(*byteReadBuffer).pos,
+                                       byteOrder: 
buffer.(*byteReadBuffer).byteOrder,
                                }
                        }(),
                        args: args{
@@ -493,10 +493,10 @@ func TestReadBuffer_ReadFloat64(t *testing.T) {
                        fields: func() fields {
                                buffer := NewReadBuffer([]byte{0x3F, 0xF0, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x02})
                                return fields{
-                                       data:      buffer.(*readBuffer).data,
-                                       reader:    buffer.(*readBuffer).reader,
-                                       pos:       buffer.(*readBuffer).pos,
-                                       byteOrder: 
buffer.(*readBuffer).byteOrder,
+                                       data:      
buffer.(*byteReadBuffer).data,
+                                       reader:    
buffer.(*byteReadBuffer).reader,
+                                       pos:       buffer.(*byteReadBuffer).pos,
+                                       byteOrder: 
buffer.(*byteReadBuffer).byteOrder,
                                }
                        }(),
                        args: args{
@@ -512,10 +512,10 @@ func TestReadBuffer_ReadFloat64(t *testing.T) {
                        fields: func() fields {
                                buffer := 
NewLittleEndianReadBuffer([]byte{0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 
0x3F})
                                return fields{
-                                       data:      buffer.(*readBuffer).data,
-                                       reader:    buffer.(*readBuffer).reader,
-                                       pos:       buffer.(*readBuffer).pos,
-                                       byteOrder: 
buffer.(*readBuffer).byteOrder,
+                                       data:      
buffer.(*byteReadBuffer).data,
+                                       reader:    
buffer.(*byteReadBuffer).reader,
+                                       pos:       buffer.(*byteReadBuffer).pos,
+                                       byteOrder: 
buffer.(*byteReadBuffer).byteOrder,
                                }
                        }(),
                        args: args{
@@ -531,10 +531,10 @@ func TestReadBuffer_ReadFloat64(t *testing.T) {
                        fields: func() fields {
                                buffer := NewReadBuffer([]byte{0x40, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00})
                                return fields{
-                                       data:      buffer.(*readBuffer).data,
-                                       reader:    buffer.(*readBuffer).reader,
-                                       pos:       buffer.(*readBuffer).pos,
-                                       byteOrder: 
buffer.(*readBuffer).byteOrder,
+                                       data:      
buffer.(*byteReadBuffer).data,
+                                       reader:    
buffer.(*byteReadBuffer).reader,
+                                       pos:       buffer.(*byteReadBuffer).pos,
+                                       byteOrder: 
buffer.(*byteReadBuffer).byteOrder,
                                }
                        }(),
                        args: args{
@@ -550,10 +550,10 @@ func TestReadBuffer_ReadFloat64(t *testing.T) {
                        fields: func() fields {
                                buffer := 
NewLittleEndianReadBuffer([]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x40})
                                return fields{
-                                       data:      buffer.(*readBuffer).data,
-                                       reader:    buffer.(*readBuffer).reader,
-                                       pos:       buffer.(*readBuffer).pos,
-                                       byteOrder: 
buffer.(*readBuffer).byteOrder,
+                                       data:      
buffer.(*byteReadBuffer).data,
+                                       reader:    
buffer.(*byteReadBuffer).reader,
+                                       pos:       buffer.(*byteReadBuffer).pos,
+                                       byteOrder: 
buffer.(*byteReadBuffer).byteOrder,
                                }
                        }(),
                        args: args{
@@ -569,10 +569,10 @@ func TestReadBuffer_ReadFloat64(t *testing.T) {
                        fields: func() fields {
                                buffer := NewReadBuffer([]byte{0xC0, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00})
                                return fields{
-                                       data:      buffer.(*readBuffer).data,
-                                       reader:    buffer.(*readBuffer).reader,
-                                       pos:       buffer.(*readBuffer).pos,
-                                       byteOrder: 
buffer.(*readBuffer).byteOrder,
+                                       data:      
buffer.(*byteReadBuffer).data,
+                                       reader:    
buffer.(*byteReadBuffer).reader,
+                                       pos:       buffer.(*byteReadBuffer).pos,
+                                       byteOrder: 
buffer.(*byteReadBuffer).byteOrder,
                                }
                        }(),
                        args: args{
@@ -588,10 +588,10 @@ func TestReadBuffer_ReadFloat64(t *testing.T) {
                        fields: func() fields {
                                buffer := 
NewLittleEndianReadBuffer([]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0xC0})
                                return fields{
-                                       data:      buffer.(*readBuffer).data,
-                                       reader:    buffer.(*readBuffer).reader,
-                                       pos:       buffer.(*readBuffer).pos,
-                                       byteOrder: 
buffer.(*readBuffer).byteOrder,
+                                       data:      
buffer.(*byteReadBuffer).data,
+                                       reader:    
buffer.(*byteReadBuffer).reader,
+                                       pos:       buffer.(*byteReadBuffer).pos,
+                                       byteOrder: 
buffer.(*byteReadBuffer).byteOrder,
                                }
                        }(),
                        args: args{
@@ -616,10 +616,10 @@ func TestReadBuffer_ReadFloat64(t *testing.T) {
                        fields: func() fields {
                                buffer := NewReadBuffer([]byte{0x40, 0x08, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00})
                                return fields{
-                                       data:      buffer.(*readBuffer).data,
-                                       reader:    buffer.(*readBuffer).reader,
-                                       pos:       buffer.(*readBuffer).pos,
-                                       byteOrder: 
buffer.(*readBuffer).byteOrder,
+                                       data:      
buffer.(*byteReadBuffer).data,
+                                       reader:    
buffer.(*byteReadBuffer).reader,
+                                       pos:       buffer.(*byteReadBuffer).pos,
+                                       byteOrder: 
buffer.(*byteReadBuffer).byteOrder,
                                }
                        }(),
                        args: args{
@@ -635,10 +635,10 @@ func TestReadBuffer_ReadFloat64(t *testing.T) {
                        fields: func() fields {
                                buffer := 
NewLittleEndianReadBuffer([]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 
0x40})
                                return fields{
-                                       data:      buffer.(*readBuffer).data,
-                                       reader:    buffer.(*readBuffer).reader,
-                                       pos:       buffer.(*readBuffer).pos,
-                                       byteOrder: 
buffer.(*readBuffer).byteOrder,
+                                       data:      
buffer.(*byteReadBuffer).data,
+                                       reader:    
buffer.(*byteReadBuffer).reader,
+                                       pos:       buffer.(*byteReadBuffer).pos,
+                                       byteOrder: 
buffer.(*byteReadBuffer).byteOrder,
                                }
                        }(),
                        args: args{
@@ -654,10 +654,10 @@ func TestReadBuffer_ReadFloat64(t *testing.T) {
                        fields: func() fields {
                                buffer := NewReadBuffer([]byte{0x40, 0x10, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00})
                                return fields{
-                                       data:      buffer.(*readBuffer).data,
-                                       reader:    buffer.(*readBuffer).reader,
-                                       pos:       buffer.(*readBuffer).pos,
-                                       byteOrder: 
buffer.(*readBuffer).byteOrder,
+                                       data:      
buffer.(*byteReadBuffer).data,
+                                       reader:    
buffer.(*byteReadBuffer).reader,
+                                       pos:       buffer.(*byteReadBuffer).pos,
+                                       byteOrder: 
buffer.(*byteReadBuffer).byteOrder,
                                }
                        }(),
                        args: args{
@@ -673,10 +673,10 @@ func TestReadBuffer_ReadFloat64(t *testing.T) {
                        fields: func() fields {
                                buffer := 
NewLittleEndianReadBuffer([]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 
0x40})
                                return fields{
-                                       data:      buffer.(*readBuffer).data,
-                                       reader:    buffer.(*readBuffer).reader,
-                                       pos:       buffer.(*readBuffer).pos,
-                                       byteOrder: 
buffer.(*readBuffer).byteOrder,
+                                       data:      
buffer.(*byteReadBuffer).data,
+                                       reader:    
buffer.(*byteReadBuffer).reader,
+                                       pos:       buffer.(*byteReadBuffer).pos,
+                                       byteOrder: 
buffer.(*byteReadBuffer).byteOrder,
                                }
                        }(),
                        args: args{
@@ -692,10 +692,10 @@ func TestReadBuffer_ReadFloat64(t *testing.T) {
                        fields: func() fields {
                                buffer := NewReadBuffer([]byte{0x40, 0x14, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00})
                                return fields{
-                                       data:      buffer.(*readBuffer).data,
-                                       reader:    buffer.(*readBuffer).reader,
-                                       pos:       buffer.(*readBuffer).pos,
-                                       byteOrder: 
buffer.(*readBuffer).byteOrder,
+                                       data:      
buffer.(*byteReadBuffer).data,
+                                       reader:    
buffer.(*byteReadBuffer).reader,
+                                       pos:       buffer.(*byteReadBuffer).pos,
+                                       byteOrder: 
buffer.(*byteReadBuffer).byteOrder,
                                }
                        }(),
                        args: args{
@@ -711,10 +711,10 @@ func TestReadBuffer_ReadFloat64(t *testing.T) {
                        fields: func() fields {
                                buffer := 
NewLittleEndianReadBuffer([]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 
0x40})
                                return fields{
-                                       data:      buffer.(*readBuffer).data,
-                                       reader:    buffer.(*readBuffer).reader,
-                                       pos:       buffer.(*readBuffer).pos,
-                                       byteOrder: 
buffer.(*readBuffer).byteOrder,
+                                       data:      
buffer.(*byteReadBuffer).data,
+                                       reader:    
buffer.(*byteReadBuffer).reader,
+                                       pos:       buffer.(*byteReadBuffer).pos,
+                                       byteOrder: 
buffer.(*byteReadBuffer).byteOrder,
                                }
                        }(),
                        args: args{
@@ -730,10 +730,10 @@ func TestReadBuffer_ReadFloat64(t *testing.T) {
                        fields: func() fields {
                                buffer := NewReadBuffer([]byte{0x40, 0x18, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00})
                                return fields{
-                                       data:      buffer.(*readBuffer).data,
-                                       reader:    buffer.(*readBuffer).reader,
-                                       pos:       buffer.(*readBuffer).pos,
-                                       byteOrder: 
buffer.(*readBuffer).byteOrder,
+                                       data:      
buffer.(*byteReadBuffer).data,
+                                       reader:    
buffer.(*byteReadBuffer).reader,
+                                       pos:       buffer.(*byteReadBuffer).pos,
+                                       byteOrder: 
buffer.(*byteReadBuffer).byteOrder,
                                }
                        }(),
                        args: args{
@@ -749,10 +749,10 @@ func TestReadBuffer_ReadFloat64(t *testing.T) {
                        fields: func() fields {
                                buffer := 
NewLittleEndianReadBuffer([]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 
0x40})
                                return fields{
-                                       data:      buffer.(*readBuffer).data,
-                                       reader:    buffer.(*readBuffer).reader,
-                                       pos:       buffer.(*readBuffer).pos,
-                                       byteOrder: 
buffer.(*readBuffer).byteOrder,
+                                       data:      
buffer.(*byteReadBuffer).data,
+                                       reader:    
buffer.(*byteReadBuffer).reader,
+                                       pos:       buffer.(*byteReadBuffer).pos,
+                                       byteOrder: 
buffer.(*byteReadBuffer).byteOrder,
                                }
                        }(),
                        args: args{
@@ -768,10 +768,10 @@ func TestReadBuffer_ReadFloat64(t *testing.T) {
                        fields: func() fields {
                                buffer := NewReadBuffer([]byte{0x40, 0x37, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00})
                                return fields{
-                                       data:      buffer.(*readBuffer).data,
-                                       reader:    buffer.(*readBuffer).reader,
-                                       pos:       buffer.(*readBuffer).pos,
-                                       byteOrder: 
buffer.(*readBuffer).byteOrder,
+                                       data:      
buffer.(*byteReadBuffer).data,
+                                       reader:    
buffer.(*byteReadBuffer).reader,
+                                       pos:       buffer.(*byteReadBuffer).pos,
+                                       byteOrder: 
buffer.(*byteReadBuffer).byteOrder,
                                }
                        }(),
                        args: args{
@@ -787,10 +787,10 @@ func TestReadBuffer_ReadFloat64(t *testing.T) {
                        fields: func() fields {
                                buffer := 
NewLittleEndianReadBuffer([]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x37, 
0x40})
                                return fields{
-                                       data:      buffer.(*readBuffer).data,
-                                       reader:    buffer.(*readBuffer).reader,
-                                       pos:       buffer.(*readBuffer).pos,
-                                       byteOrder: 
buffer.(*readBuffer).byteOrder,
+                                       data:      
buffer.(*byteReadBuffer).data,
+                                       reader:    
buffer.(*byteReadBuffer).reader,
+                                       pos:       buffer.(*byteReadBuffer).pos,
+                                       byteOrder: 
buffer.(*byteReadBuffer).byteOrder,
                                }
                        }(),
                        args: args{
@@ -806,10 +806,10 @@ func TestReadBuffer_ReadFloat64(t *testing.T) {
                        fields: func() fields {
                                buffer := NewReadBuffer([]byte{0x3F, 0x88, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00})
                                return fields{
-                                       data:      buffer.(*readBuffer).data,
-                                       reader:    buffer.(*readBuffer).reader,
-                                       pos:       buffer.(*readBuffer).pos,
-                                       byteOrder: 
buffer.(*readBuffer).byteOrder,
+                                       data:      
buffer.(*byteReadBuffer).data,
+                                       reader:    
buffer.(*byteReadBuffer).reader,
+                                       pos:       buffer.(*byteReadBuffer).pos,
+                                       byteOrder: 
buffer.(*byteReadBuffer).byteOrder,
                                }
                        }(),
                        args: args{
@@ -825,10 +825,10 @@ func TestReadBuffer_ReadFloat64(t *testing.T) {
                        fields: func() fields {
                                buffer := 
NewLittleEndianReadBuffer([]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 
0x3F})
                                return fields{
-                                       data:      buffer.(*readBuffer).data,
-                                       reader:    buffer.(*readBuffer).reader,
-                                       pos:       buffer.(*readBuffer).pos,
-                                       byteOrder: 
buffer.(*readBuffer).byteOrder,
+                                       data:      
buffer.(*byteReadBuffer).data,
+                                       reader:    
buffer.(*byteReadBuffer).reader,
+                                       pos:       buffer.(*byteReadBuffer).pos,
+                                       byteOrder: 
buffer.(*byteReadBuffer).byteOrder,
                                }
                        }(),
                        args: args{
@@ -851,10 +851,10 @@ func TestReadBuffer_ReadFloat64(t *testing.T) {
                        fields: func() fields {
                                buffer := NewReadBuffer([]byte{0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x01})
                                return fields{
-                                       data:      buffer.(*readBuffer).data,
-                                       reader:    buffer.(*readBuffer).reader,
-                                       pos:       buffer.(*readBuffer).pos,
-                                       byteOrder: 
buffer.(*readBuffer).byteOrder,
+                                       data:      
buffer.(*byteReadBuffer).data,
+                                       reader:    
buffer.(*byteReadBuffer).reader,
+                                       pos:       buffer.(*byteReadBuffer).pos,
+                                       byteOrder: 
buffer.(*byteReadBuffer).byteOrder,
                                }
                        }(),
                        args: args{
@@ -870,10 +870,10 @@ func TestReadBuffer_ReadFloat64(t *testing.T) {
                        fields: func() fields {
                                buffer := 
NewLittleEndianReadBuffer([]byte{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00})
                                return fields{
-                                       data:      buffer.(*readBuffer).data,
-                                       reader:    buffer.(*readBuffer).reader,
-                                       pos:       buffer.(*readBuffer).pos,
-                                       byteOrder: 
buffer.(*readBuffer).byteOrder,
+                                       data:      
buffer.(*byteReadBuffer).data,
+                                       reader:    
buffer.(*byteReadBuffer).reader,
+                                       pos:       buffer.(*byteReadBuffer).pos,
+                                       byteOrder: 
buffer.(*byteReadBuffer).byteOrder,
                                }
                        }(),
                        args: args{
@@ -889,10 +889,10 @@ func TestReadBuffer_ReadFloat64(t *testing.T) {
                        fields: func() fields {
                                buffer := NewReadBuffer([]byte{0x00, 0x0F, 
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF})
                                return fields{
-                                       data:      buffer.(*readBuffer).data,
-                                       reader:    buffer.(*readBuffer).reader,
-                                       pos:       buffer.(*readBuffer).pos,
-                                       byteOrder: 
buffer.(*readBuffer).byteOrder,
+                                       data:      
buffer.(*byteReadBuffer).data,
+                                       reader:    
buffer.(*byteReadBuffer).reader,
+                                       pos:       buffer.(*byteReadBuffer).pos,
+                                       byteOrder: 
buffer.(*byteReadBuffer).byteOrder,
                                }
                        }(),
                        args: args{
@@ -908,10 +908,10 @@ func TestReadBuffer_ReadFloat64(t *testing.T) {
                        fields: func() fields {
                                buffer := 
NewLittleEndianReadBuffer([]byte{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 
0x00})
                                return fields{
-                                       data:      buffer.(*readBuffer).data,
-                                       reader:    buffer.(*readBuffer).reader,
-                                       pos:       buffer.(*readBuffer).pos,
-                                       byteOrder: 
buffer.(*readBuffer).byteOrder,
+                                       data:      
buffer.(*byteReadBuffer).data,
+                                       reader:    
buffer.(*byteReadBuffer).reader,
+                                       pos:       buffer.(*byteReadBuffer).pos,
+                                       byteOrder: 
buffer.(*byteReadBuffer).byteOrder,
                                }
                        }(),
                        args: args{
@@ -927,10 +927,10 @@ func TestReadBuffer_ReadFloat64(t *testing.T) {
                        fields: func() fields {
                                buffer := NewReadBuffer([]byte{0x00, 0x01, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00})
                                return fields{
-                                       data:      buffer.(*readBuffer).data,
-                                       reader:    buffer.(*readBuffer).reader,
-                                       pos:       buffer.(*readBuffer).pos,
-                                       byteOrder: 
buffer.(*readBuffer).byteOrder,
+                                       data:      
buffer.(*byteReadBuffer).data,
+                                       reader:    
buffer.(*byteReadBuffer).reader,
+                                       pos:       buffer.(*byteReadBuffer).pos,
+                                       byteOrder: 
buffer.(*byteReadBuffer).byteOrder,
                                }
                        }(),
                        args: args{
@@ -946,10 +946,10 @@ func TestReadBuffer_ReadFloat64(t *testing.T) {
                        fields: func() fields {
                                buffer := 
NewLittleEndianReadBuffer([]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
0x00})
                                return fields{
-                                       data:      buffer.(*readBuffer).data,
-                                       reader:    buffer.(*readBuffer).reader,
-                                       pos:       buffer.(*readBuffer).pos,
-                                       byteOrder: 
buffer.(*readBuffer).byteOrder,
+                                       data:      
buffer.(*byteReadBuffer).data,
+                                       reader:    
buffer.(*byteReadBuffer).reader,
+                                       pos:       buffer.(*byteReadBuffer).pos,
+                                       byteOrder: 
buffer.(*byteReadBuffer).byteOrder,
                                }
                        }(),
                        args: args{
@@ -965,10 +965,10 @@ func TestReadBuffer_ReadFloat64(t *testing.T) {
                        fields: func() fields {
                                buffer := NewReadBuffer([]byte{0x7F, 0xEF, 
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF})
                                return fields{
-                                       data:      buffer.(*readBuffer).data,
-                                       reader:    buffer.(*readBuffer).reader,
-                                       pos:       buffer.(*readBuffer).pos,
-                                       byteOrder: 
buffer.(*readBuffer).byteOrder,
+                                       data:      
buffer.(*byteReadBuffer).data,
+                                       reader:    
buffer.(*byteReadBuffer).reader,
+                                       pos:       buffer.(*byteReadBuffer).pos,
+                                       byteOrder: 
buffer.(*byteReadBuffer).byteOrder,
                                }
                        }(),
                        args: args{
@@ -984,10 +984,10 @@ func TestReadBuffer_ReadFloat64(t *testing.T) {
                        fields: func() fields {
                                buffer := 
NewLittleEndianReadBuffer([]byte{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 
0x7F})
                                return fields{
-                                       data:      buffer.(*readBuffer).data,
-                                       reader:    buffer.(*readBuffer).reader,
-                                       pos:       buffer.(*readBuffer).pos,
-                                       byteOrder: 
buffer.(*readBuffer).byteOrder,
+                                       data:      
buffer.(*byteReadBuffer).data,
+                                       reader:    
buffer.(*byteReadBuffer).reader,
+                                       pos:       buffer.(*byteReadBuffer).pos,
+                                       byteOrder: 
buffer.(*byteReadBuffer).byteOrder,
                                }
                        }(),
                        args: args{
@@ -1014,10 +1014,10 @@ func TestReadBuffer_ReadFloat64(t *testing.T) {
                        fields: func() fields {
                                buffer := NewReadBuffer([]byte{0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00})
                                return fields{
-                                       data:      buffer.(*readBuffer).data,
-                                       reader:    buffer.(*readBuffer).reader,
-                                       pos:       buffer.(*readBuffer).pos,
-                                       byteOrder: 
buffer.(*readBuffer).byteOrder,
+                                       data:      
buffer.(*byteReadBuffer).data,
+                                       reader:    
buffer.(*byteReadBuffer).reader,
+                                       pos:       buffer.(*byteReadBuffer).pos,
+                                       byteOrder: 
buffer.(*byteReadBuffer).byteOrder,
                                }
                        }(),
                        args: args{
@@ -1033,10 +1033,10 @@ func TestReadBuffer_ReadFloat64(t *testing.T) {
                        fields: func() fields {
                                buffer := 
NewLittleEndianReadBuffer([]byte{0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00})
                                return fields{
-                                       data:      buffer.(*readBuffer).data,
-                                       reader:    buffer.(*readBuffer).reader,
-                                       pos:       buffer.(*readBuffer).pos,
-                                       byteOrder: 
buffer.(*readBuffer).byteOrder,
+                                       data:      
buffer.(*byteReadBuffer).data,
+                                       reader:    
buffer.(*byteReadBuffer).reader,
+                                       pos:       buffer.(*byteReadBuffer).pos,
+                                       byteOrder: 
buffer.(*byteReadBuffer).byteOrder,
                                }
                        }(),
                        args: args{
@@ -1052,10 +1052,10 @@ func TestReadBuffer_ReadFloat64(t *testing.T) {
                        fields: func() fields {
                                buffer := NewReadBuffer([]byte{0x80, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00})
                                return fields{
-                                       data:      buffer.(*readBuffer).data,
-                                       reader:    buffer.(*readBuffer).reader,
-                                       pos:       buffer.(*readBuffer).pos,
-                                       byteOrder: 
buffer.(*readBuffer).byteOrder,
+                                       data:      
buffer.(*byteReadBuffer).data,
+                                       reader:    
buffer.(*byteReadBuffer).reader,
+                                       pos:       buffer.(*byteReadBuffer).pos,
+                                       byteOrder: 
buffer.(*byteReadBuffer).byteOrder,
                                }
                        }(),
                        args: args{
@@ -1071,10 +1071,10 @@ func TestReadBuffer_ReadFloat64(t *testing.T) {
                        fields: func() fields {
                                buffer := 
NewLittleEndianReadBuffer([]byte{0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x80})
                                return fields{
-                                       data:      buffer.(*readBuffer).data,
-                                       reader:    buffer.(*readBuffer).reader,
-                                       pos:       buffer.(*readBuffer).pos,
-                                       byteOrder: 
buffer.(*readBuffer).byteOrder,
+                                       data:      
buffer.(*byteReadBuffer).data,
+                                       reader:    
buffer.(*byteReadBuffer).reader,
+                                       pos:       buffer.(*byteReadBuffer).pos,
+                                       byteOrder: 
buffer.(*byteReadBuffer).byteOrder,
                                }
                        }(),
                        args: args{
@@ -1090,10 +1090,10 @@ func TestReadBuffer_ReadFloat64(t *testing.T) {
                        fields: func() fields {
                                buffer := NewReadBuffer([]byte{0x7F, 0xF0, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00})
                                return fields{
-                                       data:      buffer.(*readBuffer).data,
-                                       reader:    buffer.(*readBuffer).reader,
-                                       pos:       buffer.(*readBuffer).pos,
-                                       byteOrder: 
buffer.(*readBuffer).byteOrder,
+                                       data:      
buffer.(*byteReadBuffer).data,
+                                       reader:    
buffer.(*byteReadBuffer).reader,
+                                       pos:       buffer.(*byteReadBuffer).pos,
+                                       byteOrder: 
buffer.(*byteReadBuffer).byteOrder,
                                }
                        }(),
                        args: args{
@@ -1109,10 +1109,10 @@ func TestReadBuffer_ReadFloat64(t *testing.T) {
                        fields: func() fields {
                                buffer := 
NewLittleEndianReadBuffer([]byte{0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0xF0, 
0x7F})
                                return fields{
-                                       data:      buffer.(*readBuffer).data,
-                                       reader:    buffer.(*readBuffer).reader,
-                                       pos:       buffer.(*readBuffer).pos,
-                                       byteOrder: 
buffer.(*readBuffer).byteOrder,
+                                       data:      
buffer.(*byteReadBuffer).data,
+                                       reader:    
buffer.(*byteReadBuffer).reader,
+                                       pos:       buffer.(*byteReadBuffer).pos,
+                                       byteOrder: 
buffer.(*byteReadBuffer).byteOrder,
                                }
                        }(),
                        args: args{
@@ -1128,10 +1128,10 @@ func TestReadBuffer_ReadFloat64(t *testing.T) {
                        fields: func() fields {
                                buffer := NewReadBuffer([]byte{0xFF, 0xF0, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00})
                                return fields{
-                                       data:      buffer.(*readBuffer).data,
-                                       reader:    buffer.(*readBuffer).reader,
-                                       pos:       buffer.(*readBuffer).pos,
-                                       byteOrder: 
buffer.(*readBuffer).byteOrder,
+                                       data:      
buffer.(*byteReadBuffer).data,
+                                       reader:    
buffer.(*byteReadBuffer).reader,
+                                       pos:       buffer.(*byteReadBuffer).pos,
+                                       byteOrder: 
buffer.(*byteReadBuffer).byteOrder,
                                }
                        }(),
                        args: args{
@@ -1147,10 +1147,10 @@ func TestReadBuffer_ReadFloat64(t *testing.T) {
                        fields: func() fields {
                                buffer := 
NewLittleEndianReadBuffer([]byte{0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0xF0, 
0xFF})
                                return fields{
-                                       data:      buffer.(*readBuffer).data,
-                                       reader:    buffer.(*readBuffer).reader,
-                                       pos:       buffer.(*readBuffer).pos,
-                                       byteOrder: 
buffer.(*readBuffer).byteOrder,
+                                       data:      
buffer.(*byteReadBuffer).data,
+                                       reader:    
buffer.(*byteReadBuffer).reader,
+                                       pos:       buffer.(*byteReadBuffer).pos,
+                                       byteOrder: 
buffer.(*byteReadBuffer).byteOrder,
                                }
                        }(),
                        args: args{
@@ -1166,10 +1166,10 @@ func TestReadBuffer_ReadFloat64(t *testing.T) {
                        fields: func() fields {
                                buffer := NewReadBuffer([]byte{0x7F, 0xF0, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x01})
                                return fields{
-                                       data:      buffer.(*readBuffer).data,
-                                       reader:    buffer.(*readBuffer).reader,
-                                       pos:       buffer.(*readBuffer).pos,
-                                       byteOrder: 
buffer.(*readBuffer).byteOrder,
+                                       data:      
buffer.(*byteReadBuffer).data,
+                                       reader:    
buffer.(*byteReadBuffer).reader,
+                                       pos:       buffer.(*byteReadBuffer).pos,
+                                       byteOrder: 
buffer.(*byteReadBuffer).byteOrder,
                                }
                        }(),
                        args: args{
@@ -1185,10 +1185,10 @@ func TestReadBuffer_ReadFloat64(t *testing.T) {
                        fields: func() fields {
                                buffer := 
NewLittleEndianReadBuffer([]byte{0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0xF0, 
0x7F})
                                return fields{
-                                       data:      buffer.(*readBuffer).data,
-                                       reader:    buffer.(*readBuffer).reader,
-                                       pos:       buffer.(*readBuffer).pos,
-                                       byteOrder: 
buffer.(*readBuffer).byteOrder,
+                                       data:      
buffer.(*byteReadBuffer).data,
+                                       reader:    
buffer.(*byteReadBuffer).reader,
+                                       pos:       buffer.(*byteReadBuffer).pos,
+                                       byteOrder: 
buffer.(*byteReadBuffer).byteOrder,
                                }
                        }(),
                        args: args{
@@ -1204,10 +1204,10 @@ func TestReadBuffer_ReadFloat64(t *testing.T) {
                        fields: func() fields {
                                buffer := NewReadBuffer([]byte{0x7F, 0xF8, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x01})
                                return fields{
-                                       data:      buffer.(*readBuffer).data,
-                                       reader:    buffer.(*readBuffer).reader,
-                                       pos:       buffer.(*readBuffer).pos,
-                                       byteOrder: 
buffer.(*readBuffer).byteOrder,
+                                       data:      
buffer.(*byteReadBuffer).data,
+                                       reader:    
buffer.(*byteReadBuffer).reader,
+                                       pos:       buffer.(*byteReadBuffer).pos,
+                                       byteOrder: 
buffer.(*byteReadBuffer).byteOrder,
                                }
                        }(),
                        args: args{
@@ -1223,10 +1223,10 @@ func TestReadBuffer_ReadFloat64(t *testing.T) {
                        fields: func() fields {
                                buffer := 
NewLittleEndianReadBuffer([]byte{0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0xF8, 
0x7F})
                                return fields{
-                                       data:      buffer.(*readBuffer).data,
-                                       reader:    buffer.(*readBuffer).reader,
-                                       pos:       buffer.(*readBuffer).pos,
-                                       byteOrder: 
buffer.(*readBuffer).byteOrder,
+                                       data:      
buffer.(*byteReadBuffer).data,
+                                       reader:    
buffer.(*byteReadBuffer).reader,
+                                       pos:       buffer.(*byteReadBuffer).pos,
+                                       byteOrder: 
buffer.(*byteReadBuffer).byteOrder,
                                }
                        }(),
                        args: args{
@@ -1242,10 +1242,10 @@ func TestReadBuffer_ReadFloat64(t *testing.T) {
                        fields: func() fields {
                                buffer := NewReadBuffer([]byte{0x7F, 0xFF, 
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF})
                                return fields{
-                                       data:      buffer.(*readBuffer).data,
-                                       reader:    buffer.(*readBuffer).reader,
-                                       pos:       buffer.(*readBuffer).pos,
-                                       byteOrder: 
buffer.(*readBuffer).byteOrder,
+                                       data:      
buffer.(*byteReadBuffer).data,
+                                       reader:    
buffer.(*byteReadBuffer).reader,
+                                       pos:       buffer.(*byteReadBuffer).pos,
+                                       byteOrder: 
buffer.(*byteReadBuffer).byteOrder,
                                }
                        }(),
                        args: args{
@@ -1261,10 +1261,10 @@ func TestReadBuffer_ReadFloat64(t *testing.T) {
                        fields: func() fields {
                                buffer := 
NewLittleEndianReadBuffer([]byte{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
0x7F})
                                return fields{
-                                       data:      buffer.(*readBuffer).data,
-                                       reader:    buffer.(*readBuffer).reader,
-                                       pos:       buffer.(*readBuffer).pos,
-                                       byteOrder: 
buffer.(*readBuffer).byteOrder,
+                                       data:      
buffer.(*byteReadBuffer).data,
+                                       reader:    
buffer.(*byteReadBuffer).reader,
+                                       pos:       buffer.(*byteReadBuffer).pos,
+                                       byteOrder: 
buffer.(*byteReadBuffer).byteOrder,
                                }
                        }(),
                        args: args{
@@ -1283,10 +1283,10 @@ func TestReadBuffer_ReadFloat64(t *testing.T) {
                        fields: func() fields {
                                buffer := NewReadBuffer([]byte{0x3F, 0xD5, 
0x55, 0x55, 0x55, 0x55, 0x55, 0x16})
                                return fields{
-                                       data:      buffer.(*readBuffer).data,
-                                       reader:    buffer.(*readBuffer).reader,
-                                       pos:       buffer.(*readBuffer).pos,
-                                       byteOrder: 
buffer.(*readBuffer).byteOrder,
+                                       data:      
buffer.(*byteReadBuffer).data,
+                                       reader:    
buffer.(*byteReadBuffer).reader,
+                                       pos:       buffer.(*byteReadBuffer).pos,
+                                       byteOrder: 
buffer.(*byteReadBuffer).byteOrder,
                                }
                        }(),
                        args: args{
@@ -1302,10 +1302,10 @@ func TestReadBuffer_ReadFloat64(t *testing.T) {
                        fields: func() fields {
                                buffer := 
NewLittleEndianReadBuffer([]byte{0x16, 0x55, 0x55, 0x55, 0x55, 0x55, 0xD5, 
0x3F})
                                return fields{
-                                       data:      buffer.(*readBuffer).data,
-                                       reader:    buffer.(*readBuffer).reader,
-                                       pos:       buffer.(*readBuffer).pos,
-                                       byteOrder: 
buffer.(*readBuffer).byteOrder,
+                                       data:      
buffer.(*byteReadBuffer).data,
+                                       reader:    
buffer.(*byteReadBuffer).reader,
+                                       pos:       buffer.(*byteReadBuffer).pos,
+                                       byteOrder: 
buffer.(*byteReadBuffer).byteOrder,
                                }
                        }(),
                        args: args{
@@ -1325,10 +1325,10 @@ func TestReadBuffer_ReadFloat64(t *testing.T) {
                        fields: func() fields {
                                buffer := NewReadBuffer([]byte{0x40, 0x09, 
0x21, 0xFB, 0x54, 0x44, 0x2D, 0x18})
                                return fields{
-                                       data:      buffer.(*readBuffer).data,
-                                       reader:    buffer.(*readBuffer).reader,
-                                       pos:       buffer.(*readBuffer).pos,
-                                       byteOrder: 
buffer.(*readBuffer).byteOrder,
+                                       data:      
buffer.(*byteReadBuffer).data,
+                                       reader:    
buffer.(*byteReadBuffer).reader,
+                                       pos:       buffer.(*byteReadBuffer).pos,
+                                       byteOrder: 
buffer.(*byteReadBuffer).byteOrder,
                                }
                        }(),
                        args: args{
@@ -1344,10 +1344,10 @@ func TestReadBuffer_ReadFloat64(t *testing.T) {
                        fields: func() fields {
                                buffer := 
NewLittleEndianReadBuffer([]byte{0x18, 0x2D, 0x44, 0x54, 0xFB, 0x21, 0x09, 
0x40})
                                return fields{
-                                       data:      buffer.(*readBuffer).data,
-                                       reader:    buffer.(*readBuffer).reader,
-                                       pos:       buffer.(*readBuffer).pos,
-                                       byteOrder: 
buffer.(*readBuffer).byteOrder,
+                                       data:      
buffer.(*byteReadBuffer).data,
+                                       reader:    
buffer.(*byteReadBuffer).reader,
+                                       pos:       buffer.(*byteReadBuffer).pos,
+                                       byteOrder: 
buffer.(*byteReadBuffer).byteOrder,
                                }
                        }(),
                        args: args{
@@ -1361,7 +1361,7 @@ func TestReadBuffer_ReadFloat64(t *testing.T) {
        }
        for _, tt := range tests {
                t.Run(tt.name, func(t *testing.T) {
-                       rb := &readBuffer{
+                       rb := &byteReadBuffer{
                                data:      tt.fields.data,
                                reader:    tt.fields.reader,
                                pos:       tt.fields.pos,
@@ -1401,7 +1401,7 @@ func TestReadBuffer_ReadInt16(t *testing.T) {
        }
        for _, tt := range tests {
                t.Run(tt.name, func(t *testing.T) {
-                       rb := &readBuffer{
+                       rb := &byteReadBuffer{
                                data:      tt.fields.data,
                                reader:    tt.fields.reader,
                                pos:       tt.fields.pos,
@@ -1440,7 +1440,7 @@ func TestReadBuffer_ReadInt32(t *testing.T) {
        }
        for _, tt := range tests {
                t.Run(tt.name, func(t *testing.T) {
-                       rb := &readBuffer{
+                       rb := &byteReadBuffer{
                                data:      tt.fields.data,
                                reader:    tt.fields.reader,
                                pos:       tt.fields.pos,
@@ -1479,7 +1479,7 @@ func TestReadBuffer_ReadInt64(t *testing.T) {
        }
        for _, tt := range tests {
                t.Run(tt.name, func(t *testing.T) {
-                       rb := &readBuffer{
+                       rb := &byteReadBuffer{
                                data:      tt.fields.data,
                                reader:    tt.fields.reader,
                                pos:       tt.fields.pos,
@@ -1518,7 +1518,7 @@ func TestReadBuffer_ReadInt8(t *testing.T) {
        }
        for _, tt := range tests {
                t.Run(tt.name, func(t *testing.T) {
-                       rb := &readBuffer{
+                       rb := &byteReadBuffer{
                                data:      tt.fields.data,
                                reader:    tt.fields.reader,
                                pos:       tt.fields.pos,
@@ -1557,7 +1557,7 @@ func TestReadBuffer_ReadString(t *testing.T) {
        }
        for _, tt := range tests {
                t.Run(tt.name, func(t *testing.T) {
-                       rb := &readBuffer{
+                       rb := &byteReadBuffer{
                                data:      tt.fields.data,
                                reader:    tt.fields.reader,
                                pos:       tt.fields.pos,
@@ -1596,7 +1596,7 @@ func TestReadBuffer_ReadUint16(t *testing.T) {
        }
        for _, tt := range tests {
                t.Run(tt.name, func(t *testing.T) {
-                       rb := &readBuffer{
+                       rb := &byteReadBuffer{
                                data:      tt.fields.data,
                                reader:    tt.fields.reader,
                                pos:       tt.fields.pos,
@@ -1636,10 +1636,10 @@ func TestReadBuffer_ReadUint32(t *testing.T) {
                        fields: func() fields {
                                buffer := NewReadBuffer([]uint8{0x0, 0x0, 0x0, 
0x1})
                                return fields{
-                                       data:      buffer.(*readBuffer).data,
-                                       reader:    buffer.(*readBuffer).reader,
-                                       pos:       buffer.(*readBuffer).pos,
-                                       byteOrder: 
buffer.(*readBuffer).byteOrder,
+                                       data:      
buffer.(*byteReadBuffer).data,
+                                       reader:    
buffer.(*byteReadBuffer).reader,
+                                       pos:       buffer.(*byteReadBuffer).pos,
+                                       byteOrder: 
buffer.(*byteReadBuffer).byteOrder,
                                }
                        }(),
                        args:    args{bitLength: 32},
@@ -1651,10 +1651,10 @@ func TestReadBuffer_ReadUint32(t *testing.T) {
                        fields: func() fields {
                                buffer := NewReadBuffer([]uint8{0x0, 0x0, 0x0, 
0x10})
                                return fields{
-                                       data:      buffer.(*readBuffer).data,
-                                       reader:    buffer.(*readBuffer).reader,
-                                       pos:       buffer.(*readBuffer).pos,
-                                       byteOrder: 
buffer.(*readBuffer).byteOrder,
+                                       data:      
buffer.(*byteReadBuffer).data,
+                                       reader:    
buffer.(*byteReadBuffer).reader,
+                                       pos:       buffer.(*byteReadBuffer).pos,
+                                       byteOrder: 
buffer.(*byteReadBuffer).byteOrder,
                                }
                        }(),
                        args:    args{bitLength: 32},
@@ -1666,10 +1666,10 @@ func TestReadBuffer_ReadUint32(t *testing.T) {
                        fields: func() fields {
                                buffer := NewReadBuffer([]uint8{0x0, 0x0, 0x1, 
0x0})
                                return fields{
-                                       data:      buffer.(*readBuffer).data,
-                                       reader:    buffer.(*readBuffer).reader,
-                                       pos:       buffer.(*readBuffer).pos,
-                                       byteOrder: 
buffer.(*readBuffer).byteOrder,
+                                       data:      
buffer.(*byteReadBuffer).data,
+                                       reader:    
buffer.(*byteReadBuffer).reader,
+                                       pos:       buffer.(*byteReadBuffer).pos,
+                                       byteOrder: 
buffer.(*byteReadBuffer).byteOrder,
                                }
                        }(),
                        args:    args{bitLength: 32},
@@ -1681,10 +1681,10 @@ func TestReadBuffer_ReadUint32(t *testing.T) {
                        fields: func() fields {
                                buffer := NewReadBuffer([]uint8{0x0, 0x1, 0x0, 
0x0})
                                return fields{
-                                       data:      buffer.(*readBuffer).data,
-                                       reader:    buffer.(*readBuffer).reader,
-                                       pos:       buffer.(*readBuffer).pos,
-                                       byteOrder: 
buffer.(*readBuffer).byteOrder,
+                                       data:      
buffer.(*byteReadBuffer).data,
+                                       reader:    
buffer.(*byteReadBuffer).reader,
+                                       pos:       buffer.(*byteReadBuffer).pos,
+                                       byteOrder: 
buffer.(*byteReadBuffer).byteOrder,
                                }
                        }(),
                        args:    args{bitLength: 32},
@@ -1696,10 +1696,10 @@ func TestReadBuffer_ReadUint32(t *testing.T) {
                        fields: func() fields {
                                buffer := NewReadBuffer([]uint8{0x1, 0x0, 0x0, 
0x0})
                                return fields{
-                                       data:      buffer.(*readBuffer).data,
-                                       reader:    buffer.(*readBuffer).reader,
-                                       pos:       buffer.(*readBuffer).pos,
-                                       byteOrder: 
buffer.(*readBuffer).byteOrder,
+                                       data:      
buffer.(*byteReadBuffer).data,
+                                       reader:    
buffer.(*byteReadBuffer).reader,
+                                       pos:       buffer.(*byteReadBuffer).pos,
+                                       byteOrder: 
buffer.(*byteReadBuffer).byteOrder,
                                }
                        }(),
                        args:    args{bitLength: 32},
@@ -1711,10 +1711,10 @@ func TestReadBuffer_ReadUint32(t *testing.T) {
                        fields: func() fields {
                                buffer := 
NewLittleEndianReadBuffer([]uint8{0x1, 0x0, 0x0, 0x0})
                                return fields{
-                                       data:      buffer.(*readBuffer).data,
-                                       reader:    buffer.(*readBuffer).reader,
-                                       pos:       buffer.(*readBuffer).pos,
-                                       byteOrder: 
buffer.(*readBuffer).byteOrder,
+                                       data:      
buffer.(*byteReadBuffer).data,
+                                       reader:    
buffer.(*byteReadBuffer).reader,
+                                       pos:       buffer.(*byteReadBuffer).pos,
+                                       byteOrder: 
buffer.(*byteReadBuffer).byteOrder,
                                }
                        }(),
                        args:    args{bitLength: 32},
@@ -1726,10 +1726,10 @@ func TestReadBuffer_ReadUint32(t *testing.T) {
                        fields: func() fields {
                                buffer := 
NewLittleEndianReadBuffer([]uint8{0x10, 0x0, 0x0, 0x0})
                                return fields{
-                                       data:      buffer.(*readBuffer).data,
-                                       reader:    buffer.(*readBuffer).reader,
-                                       pos:       buffer.(*readBuffer).pos,
-                                       byteOrder: 
buffer.(*readBuffer).byteOrder,
+                                       data:      
buffer.(*byteReadBuffer).data,
+                                       reader:    
buffer.(*byteReadBuffer).reader,
+                                       pos:       buffer.(*byteReadBuffer).pos,
+                                       byteOrder: 
buffer.(*byteReadBuffer).byteOrder,
                                }
                        }(),
                        args:    args{bitLength: 32},
@@ -1741,10 +1741,10 @@ func TestReadBuffer_ReadUint32(t *testing.T) {
                        fields: func() fields {
                                buffer := 
NewLittleEndianReadBuffer([]uint8{0x0, 0x1, 0x0, 0x0})
                                return fields{
-                                       data:      buffer.(*readBuffer).data,
-                                       reader:    buffer.(*readBuffer).reader,
-                                       pos:       buffer.(*readBuffer).pos,
-                                       byteOrder: 
buffer.(*readBuffer).byteOrder,
+                                       data:      
buffer.(*byteReadBuffer).data,
+                                       reader:    
buffer.(*byteReadBuffer).reader,
+                                       pos:       buffer.(*byteReadBuffer).pos,
+                                       byteOrder: 
buffer.(*byteReadBuffer).byteOrder,
                                }
                        }(),
                        args:    args{bitLength: 32},
@@ -1756,10 +1756,10 @@ func TestReadBuffer_ReadUint32(t *testing.T) {
                        fields: func() fields {
                                buffer := 
NewLittleEndianReadBuffer([]uint8{0x0, 0x0, 0x1, 0x0})
                                return fields{
-                                       data:      buffer.(*readBuffer).data,
-                                       reader:    buffer.(*readBuffer).reader,
-                                       pos:       buffer.(*readBuffer).pos,
-                                       byteOrder: 
buffer.(*readBuffer).byteOrder,
+                                       data:      
buffer.(*byteReadBuffer).data,
+                                       reader:    
buffer.(*byteReadBuffer).reader,
+                                       pos:       buffer.(*byteReadBuffer).pos,
+                                       byteOrder: 
buffer.(*byteReadBuffer).byteOrder,
                                }
                        }(),
                        args:    args{bitLength: 32},
@@ -1771,10 +1771,10 @@ func TestReadBuffer_ReadUint32(t *testing.T) {
                        fields: func() fields {
                                buffer := 
NewLittleEndianReadBuffer([]uint8{0x0, 0x0, 0x0, 0x1})
                                return fields{
-                                       data:      buffer.(*readBuffer).data,
-                                       reader:    buffer.(*readBuffer).reader,
-                                       pos:       buffer.(*readBuffer).pos,
-                                       byteOrder: 
buffer.(*readBuffer).byteOrder,
+                                       data:      
buffer.(*byteReadBuffer).data,
+                                       reader:    
buffer.(*byteReadBuffer).reader,
+                                       pos:       buffer.(*byteReadBuffer).pos,
+                                       byteOrder: 
buffer.(*byteReadBuffer).byteOrder,
                                }
                        }(),
                        args:    args{bitLength: 32},
@@ -1784,7 +1784,7 @@ func TestReadBuffer_ReadUint32(t *testing.T) {
        }
        for _, tt := range tests {
                t.Run(tt.name, func(t *testing.T) {
-                       rb := &readBuffer{
+                       rb := &byteReadBuffer{
                                data:      tt.fields.data,
                                reader:    tt.fields.reader,
                                pos:       tt.fields.pos,
@@ -1823,7 +1823,7 @@ func TestReadBuffer_ReadUint64(t *testing.T) {
        }
        for _, tt := range tests {
                t.Run(tt.name, func(t *testing.T) {
-                       rb := &readBuffer{
+                       rb := &byteReadBuffer{
                                data:      tt.fields.data,
                                reader:    tt.fields.reader,
                                pos:       tt.fields.pos,
@@ -1862,7 +1862,7 @@ func TestReadBuffer_ReadUint8(t *testing.T) {
        }
        for _, tt := range tests {
                t.Run(tt.name, func(t *testing.T) {
-                       rb := &readBuffer{
+                       rb := &byteReadBuffer{
                                data:      tt.fields.data,
                                reader:    tt.fields.reader,
                                pos:       tt.fields.pos,
@@ -1895,7 +1895,7 @@ func TestReadBuffer_Reset(t *testing.T) {
        }
        for _, tt := range tests {
                t.Run(tt.name, func(t *testing.T) {
-                       rb := &readBuffer{
+                       rb := &byteReadBuffer{
                                data:      tt.fields.data,
                                reader:    tt.fields.reader,
                                pos:       tt.fields.pos,
diff --git a/plc4go/internal/plc4go/spi/utils/ReadBufferXmlBased.go 
b/plc4go/internal/plc4go/spi/utils/ReadBufferXmlBased.go
new file mode 100644
index 0000000..d439b11
--- /dev/null
+++ b/plc4go/internal/plc4go/spi/utils/ReadBufferXmlBased.go
@@ -0,0 +1,346 @@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+
+package utils
+
+import (
+       "encoding/xml"
+       "fmt"
+       "github.com/pkg/errors"
+       "io"
+       "math/big"
+)
+
+func NewXmlReadBuffer(reader io.Reader) ReadBuffer {
+       return &xmlReadBuffer{
+               xml.NewDecoder(reader),
+               1,
+       }
+}
+
+///////////////////////////////////////
+///////////////////////////////////////
+//
+// Internal section
+//
+
+type xmlReadBuffer struct {
+       *xml.Decoder
+       pos uint
+}
+
+//
+// Internal section
+//
+///////////////////////////////////////
+///////////////////////////////////////
+
+func (x *xmlReadBuffer) Reset() {
+       panic("implement me")
+}
+
+func (x *xmlReadBuffer) GetPos() uint16 {
+       return uint16(x.pos / 8)
+}
+
+func (x *xmlReadBuffer) GetBytes() []uint8 {
+       panic("implement me")
+}
+
+func (x *xmlReadBuffer) GetTotalBytes() uint64 {
+       panic("implement me")
+}
+
+func (x *xmlReadBuffer) HasMore(bitLength uint8) bool {
+       return true
+}
+
+func (x *xmlReadBuffer) PeekByte(offset uint8) uint8 {
+       panic("implement me")
+}
+
+func (x *xmlReadBuffer) PullContext(logicalName string, readerArgs 
...WithReaderArgs) error {
+       startElement, err := x.travelToNextStartElement()
+       if err != nil {
+               return err
+       }
+       if startElement.Name.Local != logicalName {
+               return errors.Errorf("Unexpected Start element '%s'. Expected 
'%s'", startElement.Name.Local, logicalName)
+       }
+       return nil
+}
+
+func (x *xmlReadBuffer) ReadBit(logicalName string, readerArgs 
...WithReaderArgs) (bool, error) {
+       var value bool
+       err := x.decode(logicalName, "bit", 1, readerArgs, &value)
+       if err != nil {
+               return false, err
+       }
+       x.move(1)
+       return value, nil
+}
+
+func (x *xmlReadBuffer) ReadUint8(logicalName string, bitLength uint8, 
readerArgs ...WithReaderArgs) (uint8, error) {
+       var value uint8
+       err := x.decode(logicalName, "uint8", bitLength, readerArgs, &value)
+       if err != nil {
+               return 0, err
+       }
+       x.move(bitLength)
+       return value, nil
+}
+
+func (x *xmlReadBuffer) ReadUint16(logicalName string, bitLength uint8, 
readerArgs ...WithReaderArgs) (uint16, error) {
+       var value uint16
+       err := x.decode(logicalName, "uint16", bitLength, readerArgs, &value)
+       if err != nil {
+               return 0, err
+       }
+       x.move(bitLength)
+       return value, nil
+}
+
+func (x *xmlReadBuffer) ReadUint32(logicalName string, bitLength uint8, 
readerArgs ...WithReaderArgs) (uint32, error) {
+       var value uint32
+       err := x.decode(logicalName, "uint32", bitLength, readerArgs, &value)
+       if err != nil {
+               return 0, err
+       }
+       x.move(bitLength)
+       return value, nil
+}
+
+func (x *xmlReadBuffer) ReadUint64(logicalName string, bitLength uint8, 
readerArgs ...WithReaderArgs) (uint64, error) {
+       var value uint64
+       err := x.decode(logicalName, "uint64", bitLength, readerArgs, &value)
+       if err != nil {
+               return 0, err
+       }
+       x.move(bitLength)
+       return value, nil
+}
+
+func (x *xmlReadBuffer) ReadInt8(logicalName string, bitLength uint8, 
readerArgs ...WithReaderArgs) (int8, error) {
+       var value int8
+       err := x.decode(logicalName, "int8", bitLength, readerArgs, &value)
+       if err != nil {
+               return 0, err
+       }
+       x.move(bitLength)
+       return value, nil
+}
+
+func (x *xmlReadBuffer) ReadInt16(logicalName string, bitLength uint8, 
readerArgs ...WithReaderArgs) (int16, error) {
+       var value int16
+       err := x.decode(logicalName, "int16", bitLength, readerArgs, &value)
+       if err != nil {
+               return 0, err
+       }
+       x.move(bitLength)
+       return value, nil
+}
+
+func (x *xmlReadBuffer) ReadInt32(logicalName string, bitLength uint8, 
readerArgs ...WithReaderArgs) (int32, error) {
+       var value int32
+       err := x.decode(logicalName, "int32", bitLength, readerArgs, &value)
+       if err != nil {
+               return 0, err
+       }
+       x.move(bitLength)
+       return value, nil
+}
+
+func (x *xmlReadBuffer) ReadInt64(logicalName string, bitLength uint8, 
readerArgs ...WithReaderArgs) (int64, error) {
+       var value int64
+       err := x.decode(logicalName, "int64", bitLength, readerArgs, &value)
+       if err != nil {
+               return 0, err
+       }
+       x.move(bitLength)
+       return value, nil
+}
+
+func (x *xmlReadBuffer) ReadBigInt(logicalName string, bitLength uint64, 
readerArgs ...WithReaderArgs) (*big.Int, error) {
+       var value big.Int
+       // TODO: bitLength is too short for a big int
+       err := x.decode(logicalName, "bigInt", uint8(bitLength), readerArgs, 
&value)
+       if err != nil {
+               return nil, err
+       }
+       x.move(uint8(bitLength))
+       return &value, nil
+}
+
+func (x *xmlReadBuffer) ReadFloat32(logicalName string, signed bool, 
exponentBitLength uint8, mantissaBitLength uint8, readerArgs ...WithReaderArgs) 
(float32, error) {
+       bitLength := exponentBitLength + mantissaBitLength
+       if signed {
+               bitLength += 1
+       }
+       var value float32
+       err := x.decode(logicalName, "float32", bitLength, readerArgs, &value)
+       if err != nil {
+               return 0, err
+       }
+       x.move(bitLength)
+       return value, nil
+}
+
+func (x *xmlReadBuffer) ReadFloat64(logicalName string, signed bool, 
exponentBitLength uint8, mantissaBitLength uint8, readerArgs ...WithReaderArgs) 
(float64, error) {
+       bitLength := exponentBitLength + mantissaBitLength
+       if signed {
+               bitLength += 1
+       }
+       var value float64
+       err := x.decode(logicalName, "float64", bitLength, readerArgs, &value)
+       if err != nil {
+               return 0, err
+       }
+       x.move(bitLength)
+       return value, nil
+}
+
+func (x *xmlReadBuffer) ReadBigFloat(logicalName string, signed bool, 
exponentBitLength uint8, mantissaBitLength uint8, readerArgs ...WithReaderArgs) 
(*big.Float, error) {
+       bitLength := exponentBitLength + mantissaBitLength
+       if signed {
+               bitLength += 1
+       }
+       var value big.Float
+       err := x.decode(logicalName, "bigFloat", bitLength, readerArgs, &value)
+       if err != nil {
+               return nil, err
+       }
+       x.move(bitLength)
+       return &value, nil
+}
+
+func (x *xmlReadBuffer) ReadString(logicalName string, bitLength uint32, 
readerArgs ...WithReaderArgs) (string, error) {
+       var value string
+       // TODO: bitlength too short
+       err := x.decode(logicalName, "string", uint8(bitLength), readerArgs, 
&value)
+       if err != nil {
+               return "", err
+       }
+       x.move(uint8(bitLength))
+       return value, nil
+}
+
+func (x *xmlReadBuffer) CloseContext(logicalName string, _ ...WithReaderArgs) 
error {
+       endElement, err := x.travelToNextEndElement()
+       if err != nil {
+               return err
+       }
+       if endElement.Name.Local != logicalName {
+               return errors.Errorf("Unexpected End element '%s'. Expected 
'%s'", endElement.Name.Local, logicalName)
+       }
+       return nil
+}
+
+func (x *xmlReadBuffer) move(bits uint8) {
+       x.pos += uint(bits)
+}
+
+func (x *xmlReadBuffer) travelToNextStartElement() (xml.StartElement, error) {
+       var startElement xml.StartElement
+findTheStartToken:
+       for {
+               token, err := x.Token()
+               if err != nil {
+                       return xml.StartElement{}, err
+               }
+               switch token.(type) {
+               case xml.StartElement:
+                       startElement = token.(xml.StartElement)
+                       break findTheStartToken
+               case xml.EndElement:
+                       return xml.StartElement{}, errors.Errorf("unexpected 
end element %s", token.(xml.EndElement).Name)
+               }
+       }
+       return startElement, nil
+}
+
+func (x *xmlReadBuffer) travelToNextEndElement() (xml.EndElement, error) {
+       var endElement xml.EndElement
+findTheEndToken:
+       for {
+               token, err := x.Token()
+               if err != nil {
+                       return xml.EndElement{}, err
+               }
+               switch token.(type) {
+               case xml.EndElement:
+                       endElement = token.(xml.EndElement)
+                       break findTheEndToken
+               case xml.StartElement:
+                       return xml.EndElement{}, errors.Errorf("unexpected 
start element %s", token.(xml.StartElement).Name)
+               }
+       }
+       return endElement, nil
+}
+
+func (x *xmlReadBuffer) decode(logicalName string, dataType string, bitLength 
uint8, readerArgs []WithReaderArgs, targetValue interface{}) error {
+       startElement, err := x.travelToNextStartElement()
+       if err != nil {
+               return err
+       }
+       err = validateStartElement(startElement, logicalName, dataType, 
bitLength, readerArgs...)
+       if err != nil {
+               return err
+       }
+       err = x.DecodeElement(targetValue, &startElement)
+       if err != nil {
+               return err
+       }
+       return nil
+}
+
+func validateStartElement(startElement xml.StartElement, logicalName string, 
dataType string, bitLength uint8, readerArgs ...WithReaderArgs) error {
+       logicalName = sanitizeLogicalName(logicalName)
+       if startElement.Name.Local != logicalName {
+               return errors.Errorf("unexpected element '%s'. Expected '%s'", 
startElement.Name.Local, logicalName)
+       } else if err := validateAttr(startElement.Attr, dataType, bitLength, 
readerArgs...); err != nil {
+               return errors.Wrap(err, "Error validating Attributes")
+       }
+       return nil
+}
+
+func validateAttr(attr []xml.Attr, dataType string, bitLength uint8, 
readerArgs ...WithReaderArgs) error {
+       dataTypeValidated := false
+       bitLengthValidate := false
+       for _, attribute := range attr {
+               switch attribute.Name.Local {
+               case "dataType":
+                       if attribute.Value != dataType {
+                               return errors.Errorf("Unexpected dataType :%s. 
Want %s", attribute.Value, dataType)
+                       }
+                       dataTypeValidated = true
+               case "bitLength":
+                       if attribute.Value != fmt.Sprintf("%d", bitLength) {
+                               return errors.Errorf("Unexpected bitLength 
'%s'. Want '%d'", attribute.Value, bitLength)
+                       }
+                       bitLengthValidate = true
+               }
+       }
+       if !dataTypeValidated {
+               return errors.New("required attribute dataType missing")
+       }
+       if !bitLengthValidate {
+               return errors.New("required attribute bitLength missing")
+       }
+       return nil
+}
diff --git a/plc4go/internal/plc4go/spi/utils/WriteBuffer.go 
b/plc4go/internal/plc4go/spi/utils/WriteBuffer.go
index 1fd4978..5bbd1c8 100644
--- a/plc4go/internal/plc4go/spi/utils/WriteBuffer.go
+++ b/plc4go/internal/plc4go/spi/utils/WriteBuffer.go
@@ -37,6 +37,7 @@ type WriteBuffer interface {
        WriteBigInt(logicalName string, bitLength uint8, value *big.Int, 
writerArgs ...WithWriterArgs) error
        WriteFloat32(logicalName string, bitLength uint8, value float32, 
writerArgs ...WithWriterArgs) error
        WriteFloat64(logicalName string, bitLength uint8, value float64, 
writerArgs ...WithWriterArgs) error
+       WriteBigFloat(logicalName string, bitLength uint8, value *big.Float, 
writerArgs ...WithWriterArgs) error
        WriteString(logicalName string, bitLength uint8, encoding string, value 
string, writerArgs ...WithWriterArgs) error
        PopContext(logicalName string, writerArgs ...WithWriterArgs) error
 }
diff --git a/plc4go/internal/plc4go/spi/utils/WriteBufferBoxBased.go 
b/plc4go/internal/plc4go/spi/utils/WriteBufferBoxBased.go
index 7a556e3..34acf88 100644
--- a/plc4go/internal/plc4go/spi/utils/WriteBufferBoxBased.go
+++ b/plc4go/internal/plc4go/spi/utils/WriteBufferBoxBased.go
@@ -153,6 +153,12 @@ func (b *boxedWriteBuffer) WriteFloat64(logicalName 
string, bitLength uint8, val
        return nil
 }
 
+func (b *boxedWriteBuffer) WriteBigFloat(logicalName string, bitLength uint8, 
value *big.Float, writerArgs ...WithWriterArgs) error {
+       additionalStringRepresentation := 
extractAdditionalStringRepresentation(writerArgs...)
+       b.PushBack(BoxString(logicalName, fmt.Sprintf("%#0*x %f%s", 
bitLength/4, value, value, additionalStringRepresentation), 0))
+       return nil
+}
+
 func (b *boxedWriteBuffer) WriteString(logicalName string, bitLength uint8, _ 
string, value string, writerArgs ...WithWriterArgs) error {
        additionalStringRepresentation := 
extractAdditionalStringRepresentation(writerArgs...)
        b.PushBack(BoxString(logicalName, fmt.Sprintf("%#0*x %s%s", 
bitLength/4, value, value, additionalStringRepresentation), 0))
diff --git a/plc4go/internal/plc4go/spi/utils/WriteBufferByteBased.go 
b/plc4go/internal/plc4go/spi/utils/WriteBufferByteBased.go
index b10f09f..d30a10b 100644
--- a/plc4go/internal/plc4go/spi/utils/WriteBufferByteBased.go
+++ b/plc4go/internal/plc4go/spi/utils/WriteBufferByteBased.go
@@ -38,7 +38,7 @@ type WriteBufferByteBased interface {
 func NewWriteBuffer() WriteBufferByteBased {
        data := &bytes.Buffer{}
        writer := bitio.NewWriter(data)
-       return &writeBuffer{
+       return &byteWriteBuffer{
                data:      data,
                writer:    writer,
                byteOrder: binary.BigEndian,
@@ -48,7 +48,7 @@ func NewWriteBuffer() WriteBufferByteBased {
 func NewLittleEndianWriteBuffer() WriteBufferByteBased {
        data := &bytes.Buffer{}
        writer := bitio.NewWriter(data)
-       return &writeBuffer{
+       return &byteWriteBuffer{
                data:      data,
                writer:    writer,
                byteOrder: binary.LittleEndian,
@@ -61,7 +61,7 @@ func NewLittleEndianWriteBuffer() WriteBufferByteBased {
 // Internal section
 //
 
-type writeBuffer struct {
+type byteWriteBuffer struct {
        data      *bytes.Buffer
        writer    *bitio.Writer
        byteOrder binary.ByteOrder
@@ -73,35 +73,35 @@ type writeBuffer struct {
 ///////////////////////////////////////
 ///////////////////////////////////////
 
-func (rb *writeBuffer) PushContext(_ string, _ ...WithWriterArgs) error {
+func (rb *byteWriteBuffer) PushContext(_ string, _ ...WithWriterArgs) error {
        return nil
 }
 
-func (rb *writeBuffer) PopContext(_ string, _ ...WithWriterArgs) error {
+func (rb *byteWriteBuffer) PopContext(_ string, _ ...WithWriterArgs) error {
        return nil
 }
 
-func (rb *writeBuffer) GetPos() uint16 {
+func (rb *byteWriteBuffer) GetPos() uint16 {
        return 0
 }
 
-func (rb *writeBuffer) GetBytes() []uint8 {
+func (rb *byteWriteBuffer) GetBytes() []uint8 {
        return rb.data.Bytes()
 }
 
-func (rb *writeBuffer) GetTotalBytes() uint64 {
+func (rb *byteWriteBuffer) GetTotalBytes() uint64 {
        return uint64(rb.data.Len())
 }
 
-func (rb *writeBuffer) WriteBit(_ string, value bool, _ ...WithWriterArgs) 
error {
+func (rb *byteWriteBuffer) WriteBit(_ string, value bool, _ ...WithWriterArgs) 
error {
        return rb.writer.WriteBool(value)
 }
 
-func (rb *writeBuffer) WriteUint8(_ string, bitLength uint8, value uint8, _ 
...WithWriterArgs) error {
+func (rb *byteWriteBuffer) WriteUint8(_ string, bitLength uint8, value uint8, 
_ ...WithWriterArgs) error {
        return rb.writer.WriteBits(uint64(value), bitLength)
 }
 
-func (rb *writeBuffer) WriteUint16(_ string, bitLength uint8, value uint16, _ 
...WithWriterArgs) error {
+func (rb *byteWriteBuffer) WriteUint16(_ string, bitLength uint8, value 
uint16, _ ...WithWriterArgs) error {
        if rb.byteOrder == binary.LittleEndian {
                // TODO: indirection till we have a native LE implementation
                // TODO: validate that this produces the desired result
@@ -110,7 +110,7 @@ func (rb *writeBuffer) WriteUint16(_ string, bitLength 
uint8, value uint16, _ ..
        return rb.writer.WriteBits(uint64(value), bitLength)
 }
 
-func (rb *writeBuffer) WriteUint32(_ string, bitLength uint8, value uint32, _ 
...WithWriterArgs) error {
+func (rb *byteWriteBuffer) WriteUint32(_ string, bitLength uint8, value 
uint32, _ ...WithWriterArgs) error {
        if rb.byteOrder == binary.LittleEndian {
                // TODO: indirection till we have a native LE implementation
                // TODO: validate that this produces the desired result
@@ -119,7 +119,7 @@ func (rb *writeBuffer) WriteUint32(_ string, bitLength 
uint8, value uint32, _ ..
        return rb.writer.WriteBits(uint64(value), bitLength)
 }
 
-func (rb *writeBuffer) WriteUint64(_ string, bitLength uint8, value uint64, _ 
...WithWriterArgs) error {
+func (rb *byteWriteBuffer) WriteUint64(_ string, bitLength uint8, value 
uint64, _ ...WithWriterArgs) error {
        if rb.byteOrder == binary.LittleEndian {
                // TODO: indirection till we have a native LE implementation
                // TODO: validate that this produces the desired result
@@ -128,11 +128,11 @@ func (rb *writeBuffer) WriteUint64(_ string, bitLength 
uint8, value uint64, _ ..
        return rb.writer.WriteBits(value, bitLength)
 }
 
-func (rb *writeBuffer) WriteInt8(_ string, bitLength uint8, value int8, _ 
...WithWriterArgs) error {
+func (rb *byteWriteBuffer) WriteInt8(_ string, bitLength uint8, value int8, _ 
...WithWriterArgs) error {
        return rb.writer.WriteBits(uint64(value), bitLength)
 }
 
-func (rb *writeBuffer) WriteInt16(_ string, bitLength uint8, value int16, _ 
...WithWriterArgs) error {
+func (rb *byteWriteBuffer) WriteInt16(_ string, bitLength uint8, value int16, 
_ ...WithWriterArgs) error {
        if rb.byteOrder == binary.LittleEndian {
                // TODO: indirection till we have a native LE implementation
                // TODO: validate that this produces the desired result
@@ -141,7 +141,7 @@ func (rb *writeBuffer) WriteInt16(_ string, bitLength 
uint8, value int16, _ ...W
        return rb.writer.WriteBits(uint64(value), bitLength)
 }
 
-func (rb *writeBuffer) WriteInt32(_ string, bitLength uint8, value int32, _ 
...WithWriterArgs) error {
+func (rb *byteWriteBuffer) WriteInt32(_ string, bitLength uint8, value int32, 
_ ...WithWriterArgs) error {
        if rb.byteOrder == binary.LittleEndian {
                // TODO: indirection till we have a native LE implementation
                // TODO: validate that this produces the desired result
@@ -150,7 +150,7 @@ func (rb *writeBuffer) WriteInt32(_ string, bitLength 
uint8, value int32, _ ...W
        return rb.writer.WriteBits(uint64(value), bitLength)
 }
 
-func (rb *writeBuffer) WriteInt64(_ string, bitLength uint8, value int64, _ 
...WithWriterArgs) error {
+func (rb *byteWriteBuffer) WriteInt64(_ string, bitLength uint8, value int64, 
_ ...WithWriterArgs) error {
        if rb.byteOrder == binary.LittleEndian {
                // TODO: indirection till we have a native LE implementation
                // TODO: validate that this produces the desired result
@@ -159,11 +159,11 @@ func (rb *writeBuffer) WriteInt64(_ string, bitLength 
uint8, value int64, _ ...W
        return rb.writer.WriteBits(uint64(value), bitLength)
 }
 
-func (rb *writeBuffer) WriteBigInt(_ string, bitLength uint8, value *big.Int, 
_ ...WithWriterArgs) error {
+func (rb *byteWriteBuffer) WriteBigInt(_ string, bitLength uint8, value 
*big.Int, _ ...WithWriterArgs) error {
        return errors.New("not implemented yet")
 }
 
-func (rb *writeBuffer) WriteFloat32(_ string, bitLength uint8, value float32, 
_ ...WithWriterArgs) error {
+func (rb *byteWriteBuffer) WriteFloat32(_ string, bitLength uint8, value 
float32, _ ...WithWriterArgs) error {
        if rb.byteOrder == binary.LittleEndian {
                // TODO: indirection till we have a native LE implementation
                // TODO: validate that this produces the desired result
@@ -173,7 +173,7 @@ func (rb *writeBuffer) WriteFloat32(_ string, bitLength 
uint8, value float32, _
        return rb.writer.WriteBits(uint64(res), bitLength)
 }
 
-func (rb *writeBuffer) WriteFloat64(_ string, bitLength uint8, value float64, 
_ ...WithWriterArgs) error {
+func (rb *byteWriteBuffer) WriteFloat64(_ string, bitLength uint8, value 
float64, _ ...WithWriterArgs) error {
        if rb.byteOrder == binary.LittleEndian {
                // TODO: indirection till we have a native LE implementation
                // TODO: validate that this produces the desired result
@@ -183,6 +183,10 @@ func (rb *writeBuffer) WriteFloat64(_ string, bitLength 
uint8, value float64, _
        return rb.writer.WriteBits(res, bitLength)
 }
 
-func (rb *writeBuffer) WriteString(_ string, bitLength uint8, encoding string, 
value string, _ ...WithWriterArgs) error {
+func (rb *byteWriteBuffer) WriteBigFloat(logicalName string, bitLength uint8, 
value *big.Float, writerArgs ...WithWriterArgs) error {
+       return errors.New("not implemented yet")
+}
+
+func (rb *byteWriteBuffer) WriteString(_ string, bitLength uint8, encoding 
string, value string, _ ...WithWriterArgs) error {
        return errors.New("WriteString is currently not implemented")
 }
diff --git a/plc4go/internal/plc4go/spi/utils/WriteBufferXmlBased.go 
b/plc4go/internal/plc4go/spi/utils/WriteBufferXmlBased.go
index a52fb3d..90cd1c2 100644
--- a/plc4go/internal/plc4go/spi/utils/WriteBufferXmlBased.go
+++ b/plc4go/internal/plc4go/spi/utils/WriteBufferXmlBased.go
@@ -151,6 +151,13 @@ func (x *xmlWriteBuffer) WriteFloat64(logicalName string, 
bitLength uint8, value
        })
 }
 
+func (x *xmlWriteBuffer) WriteBigFloat(logicalName string, bitLength uint8, 
value *big.Float, writerArgs ...WithWriterArgs) error {
+       return x.EncodeElement(value, xml.StartElement{
+               Name: xml.Name{Local: sanitizeLogicalName(logicalName)},
+               Attr: generateAttr("bigFloat", bitLength, writerArgs...),
+       })
+}
+
 func (x *xmlWriteBuffer) WriteString(logicalName string, bitLength uint8, 
encoding string, value string, writerArgs ...WithWriterArgs) error {
        attr := generateAttr("string", bitLength, writerArgs...)
        attr = append(attr, xml.Attr{Name: xml.Name{Local: "encoding"}, Value: 
encoding})

Reply via email to