private GenericProtocol Read(IStreamInput pDataInput)
        {
            var index = pDataInput.ReadShort();
            var node  = CopyRef(index);

            // Rekursive Methode:
            Read(pDataInput, index, node);
            return(node);
        }
        private object Read(IStreamInput pDataInput, int pIndex, GenericProtocol pNode)
        {
            if (pNode == null)
            {
                pNode = CopyRef(pIndex);
            }
            // --------------------------
            List <int> nodeIndices = pNode.NodeIndices[pIndex];

            for (int i = 0; i < nodeIndices.Count; i++)
            {
                int    localNodeIndex = nodeIndices[i];
                string localNodeName;
                switch (localNodeIndex)
                {
                case 0:
                    return(pDataInput.ReadByte());    // Byte

                case 1:
                    return(pDataInput.ReadBoolean());    // Bool(ean)

                case 2:
                    return(pDataInput.ReadByte());    // Byte

                case 3:
                    return(pDataInput.ReadShort());    // Short

                case 4:
                    return(pDataInput.ReadInt());    // Int

                case 5:
                    return(pDataInput.ReadLong());    // Long

                case 6:
                    return(pDataInput.ReadFloat());    // Float

                case 7:
                    return(pDataInput.ReadDouble());    // Double

                case 8:
                    return(pDataInput.ReadChar());    // Char

                case 9:
                    return(pDataInput.ReadUTF().Replace('\u20AD', 'K'));    // String

                case 10:
                    break;

                case 11:
                    i++;
                    localNodeIndex = nodeIndices[i];
                    localNodeName  = NodeNames[localNodeIndex];
                    var arrList = new List <object>();
                    pNode.Add(localNodeName, arrList);
                    while (pDataInput.ReadByte() == 11)
                    {
                        arrList.Add(Read(pDataInput, localNodeIndex, null));
                    }
                    i++;
                    break;

                case 12:     // Ende der Liste
                    break;

                case 13:     // new | seit ungefähr dem applet 90aeh
                    return(ReadChars(pDataInput));

                //break;
                default:
                    localNodeName = NodeNames[localNodeIndex];
                    pNode.Add(localNodeName, Read(pDataInput, localNodeIndex, null));
                    break;
                }
            }
            // --------------------------
            return(pNode);
        }