##### 8.1.5.3 Transmitting Dynamic Structure

         with Ada.Streams; use Ada.Streams;
         package StringArrayStream is
            pragma Remote_Types;

            type List is private;
            procedure Append (L : access List; O : in String);
            function  Delete (L : access List) return String;

         private
            --  implementation removed
         end StringArrayStream;

Non-remote access types cannot be declared in the public part of a remote types unit. However, it is possible to define private non-remote access types as long as the user provides its marshalling procedures, that is to say the mechanism needed to place a value of the type into a communication stream. The code below describes how to transmit a linked structure.

The package declaration provides a type definition of single-linked lists of unbounded strings. An implementation of the marshalling operations could be the following:

         package body StringArrayStream is
            procedure Read
              (S : access Root_Stream_Type'Class;
               L : out List) is
            begin
               if Boolean'Input (S) then
                  L := new Node;
                  L.Content := new String'(String'Input (S));
                  List'Read (S, L.Next);
               else
                  L := null;
               end if;
            end Read;

            procedure Write
              (S : access Root_Stream_Type'Class;
               L : in List) is
            begin
               if L = null then
                  Boolean'Output (S, False);
               else
                  Boolean'Output (S, True);
                  String'Output (S, L.Content.all);
                  List'Write (S, L.Next);
               end if;
            end Write;

            --  [...] Other services
         end StringArrayStream;