@SuppressWarnings("unchecked")
    @Override
    public SourceData decode(byte[] srcBytes, Context context) {
        try {
            // decode
            DynamicMessage.Builder builder = DynamicMessage.newBuilder(rootDesc);
            DynamicMessage root = builder.mergeFrom(srcBytes).build();
            // child
            List<DynamicMessage> childRoot = null;
            if (this.childNodes != null && this.childNodes.size() > 0) {
                DynamicMessage current = root;
                for (PbNode node : childNodes) {
                    Object nodeValue = current.getField(node.getFieldDesc());
                    if (nodeValue == null) {
                        // error data
                        return new PbSourceData(root, rootDesc, columnNodeMap, srcCharset);
                    }
                    if (node.isLastNode()) {
                        if (!(nodeValue instanceof List)) {
                            // error data
                            return new PbSourceData(root, rootDesc, columnNodeMap, srcCharset);
                        } else {
                            childRoot = (List<DynamicMessage>) nodeValue;
                            break;
                        }
                    }
                    if (!node.isArray()) {
                        if (!(nodeValue instanceof DynamicMessage)) {
                            // error data
                            return new PbSourceData(root, rootDesc, columnNodeMap, srcCharset);
                        }
                        current = (DynamicMessage) nodeValue;
                    } else {
                        if (!(nodeValue instanceof List)) {
                            // error data
                            return new PbSourceData(root, rootDesc, columnNodeMap, srcCharset);
                        }
                        List<?> nodeList = (List<?>) nodeValue;
                        if (node.getArrayIndex() >= nodeList.size()) {
                            // error data
                            return new PbSourceData(root, rootDesc, columnNodeMap, srcCharset);
                        }
                        Object nodeElement = nodeList.get(node.getArrayIndex());
                        if (!(nodeElement instanceof DynamicMessage)) {
                            // error data
                            return new PbSourceData(root, rootDesc, columnNodeMap, srcCharset);
                        }
                        current = (DynamicMessage) nodeElement;
                    }
                }
            }
            return new PbSourceData(root, childRoot, rootDesc, childDesc, columnNodeMap, srcCharset, context);
        } catch (Exception e) {
            LOG.error(e.getMessage(), e);
            return null;
        }
    }
decode
@param srcBytes
@param context
@return
@throws InvalidProtocolBufferException
inlong-sdk/transform-sdk/src/main/java/org/apache/inlong/sdk/transform/decode/PbSourceDecoder.java