/// <summary>
        /// Returns the native type name corresponding to the specified data type name.
        /// </summary>
        /// <param name="dataTypeName">
        /// the data type name
        /// </param>
        /// <returns>
        /// the corresponding native type name
        /// </returns>
        private String NativeTypeForDataType(System.String dataTypeName)
        {
            if (dataTypeName == null || dataTypeName.Equals("HLAopaqueData") || opaqueTypes.Contains(dataTypeName))
            {
                return("byte[]");
            }
            else if (dataTypeName.Equals("NA"))
            {
                return(null);
            }
            else if (dataTypeName.Equals("HLAASCIIchar") || dataTypeName.Equals("HLAunicodeChar"))
            {
                return("char");
            }
            else if (dataTypeName.Equals("HLAboolean"))
            {
                return("bool");
            }
            else if (dataTypeName.Equals("HLAASCIIstring") || dataTypeName.Equals("HLAunicodeString"))
            {
                return("String");
            }
            else if (descriptorManager.SimpleDataTypeMap.ContainsKey(dataTypeName))
            {
                return(NativeTypeForBasicRepresentation(descriptorManager.SimpleDataTypeMap[dataTypeName].Representation));
            }
            else if (descriptorManager.ArrayDataTypeMap.ContainsKey(dataTypeName))
            {
                HLAarrayDataType arrData = descriptorManager.ArrayDataTypeMap[dataTypeName];

                return(NativeTypeForDataType(arrData.DataType) + "[]");
            }
            else if (descriptorManager.BasicDataTypeMap.ContainsKey(dataTypeName))
            {
                return(NativeTypeForBasicRepresentation(dataTypeName));
            }

            else
            {
                return(dataTypeName);
            }
        }
        /// <summary>
        /// Prints a code block that will serialize the specified variable to the
        /// given stream.
        /// </summary>
        /// <param name="ps">the print stream to write the code block to
        /// </param>
        /// <param name="indentLevel">the level of indentation to use
        /// </param>
        /// <param name="iteratorVariable">the name of the iterator variable to use ('i', 'j', 'k'...)
        /// </param>
        /// <param name="dataTypeName">the name of the variable's data type
        /// </param>
        /// <param name="variableName">the name of the variable
        /// </param>
        /// <param name="streamName">the name of the stream
        /// </param>
        private void PrintSerializationBlock(System.IO.StreamWriter ps, int indentLevel, char iteratorVariable, System.String dataTypeName, System.String variableName, System.String streamName)
        {
            if (dataTypeName == null || dataTypeName.Equals("HLAopaqueData") || opaqueTypes.Contains(dataTypeName))
            {
                ps.WriteLine(GenerateIndentString(indentLevel) + streamName + ".WriteHLAopaqueData(" + variableName + ");");
            }
            else if (dataTypeName.Equals("NA"))
            {
                return;
            }
            else if (dataTypeName.Equals("HLAASCIIchar") || dataTypeName.Equals("HLAunicodeChar") ||
                     dataTypeName.Equals("HLAboolean") || dataTypeName.Equals("HLAunicodestring") ||
                     dataTypeName.Equals("HLAASCIIstring"))
            {
                ps.WriteLine(GenerateIndentString(indentLevel) + streamName + ".Write" + dataTypeName + "(" + variableName + ");");
            }
            else if (descriptorManager.BasicDataTypeMap.ContainsKey(dataTypeName))
            {
                //TODO Check if a Basic Data has a specific serializer
                ps.WriteLine(GenerateIndentString(indentLevel) + streamName + ".Write" + dataTypeName + "(" + variableName + ");");
            }
            else if (descriptorManager.SimpleDataTypeMap.ContainsKey(dataTypeName))
            {
                System.String representation = descriptorManager.SimpleDataTypeMap[dataTypeName].Representation;

                if (descriptorManager.BasicDataTypeMap.ContainsKey(representation))
                {
                    ps.WriteLine(GenerateIndentString(indentLevel) + streamName + ".Write" + representation + "(" + variableName + ");");
                }
                else
                {
                    ps.WriteLine(GenerateIndentString(indentLevel) + streamName + ".WriteHLAopaqueData(" + variableName + ");");
                }
            }
            else if (descriptorManager.ArrayDataTypeMap.ContainsKey(dataTypeName))
            {
                HLAarrayDataType arrData = descriptorManager.ArrayDataTypeMap[dataTypeName];

                if (arrData.HasNativeSerializer)
                {
                    ps.WriteLine(GenerateIndentString(indentLevel) + streamName + ".Write" + dataTypeName + "(" + variableName + ");");
                }
                else
                {
                    if (arrData.Cardinality.ToUpper().Equals("DYNAMIC"))
                    {
                        ps.WriteLine(GenerateIndentString(indentLevel) + streamName + ".WriteHLAinteger32BE((" + variableName + ").Length);");
                        ps.WriteLine();
                        ps.WriteLine(GenerateIndentString(indentLevel) + "for(int " + iteratorVariable + "=0;" + iteratorVariable + "< (" + variableName + ").Length;" + iteratorVariable + "++)");
                    }
                    else
                    {
                        ps.WriteLine(GenerateIndentString(indentLevel) + "for(int " + iteratorVariable + "=0;" + iteratorVariable + "<" + arrData.Cardinality + ";" + iteratorVariable + "++)");
                    }

                    ps.WriteLine(GenerateIndentString(indentLevel) + "{");
                    PrintSerializationBlock(ps, indentLevel + 1, (char)(iteratorVariable + 1), arrData.DataType, "(" + variableName + ")[" + iteratorVariable + "]", streamName);
                    ps.WriteLine(GenerateIndentString(indentLevel) + "}");
                }
            }
            else
            {
                if (variableName.EndsWith("]"))
                {
                    ps.WriteLine(GenerateIndentString(indentLevel) + dataTypeName + "XrtiSerializer.Serialize(" + streamName + ", " + variableName + ");");
                }
                else
                {
                    ps.WriteLine(GenerateIndentString(indentLevel) + dataTypeName + "XrtiSerializer.Serialize(" + streamName + ", " + variableName + ");");
                }
            }
        }
        /// <summary>
        /// Prints a code block that will deserialize the specified variable from the
        /// given stream.
        /// </summary>
        /// <param name="sw">the print stream to write the code block to
        /// </param>
        /// <param name="indentLevel">the level of indentation to use
        /// </param>
        /// <param name="iteratorVariable">the name of the iterator variable to use ('i', 'j', 'k'...)
        /// </param>
        /// <param name="dataTypeName">the name of the variable's data type
        /// </param>
        /// <param name="variableName">the name of the variable
        /// </param>
        /// <param name="streamName">the name of the stream
        /// </param>
        private void PrintDeserializationBlock(System.IO.StreamWriter ps, int indentLevel, char iteratorVariable, System.String dataTypeName, System.String variableName, System.String streamName)
        {
            if (dataTypeName == null || dataTypeName.Equals("HLAopaqueData") || opaqueTypes.Contains(dataTypeName))
            {
                ps.WriteLine(GenerateIndentString(indentLevel) + variableName + " = " + streamName + ".ReadHLAopaqueData();");
            }
            else if (dataTypeName.Equals("NA"))
            {
                return;
            }
            //TODO all these types are simpleDatatype. Must we consider it as default or try to look for in descriptorManager.SimpleDataTypeMap ???
            else if (dataTypeName.Equals("HLAASCIIchar") || dataTypeName.Equals("HLAunicodeChar") ||
                     dataTypeName.Equals("HLAboolean") || dataTypeName.Equals("HLAunicodestring") ||
                     dataTypeName.Equals("HLAASCIIstring"))
            {
                ps.WriteLine(GenerateIndentString(indentLevel) + variableName + " = " + streamName + ".Read" + dataTypeName + "();");
            }
            else if (descriptorManager.BasicDataTypeMap.ContainsKey(dataTypeName))
            {
                //TODO Check if a Basic Data has a specific deserializer
                ps.WriteLine(GenerateIndentString(indentLevel) + variableName + " = " + streamName + ".Read" + dataTypeName + "();");
            }
            else if (descriptorManager.SimpleDataTypeMap.ContainsKey(dataTypeName))
            {
                System.String representation = descriptorManager.SimpleDataTypeMap[dataTypeName].Representation;

                if (descriptorManager.BasicDataTypeMap.ContainsKey(representation))
                {
                    ps.WriteLine(GenerateIndentString(indentLevel) + variableName + " = " + streamName + ".Read" + representation + "();");
                }
                else
                {
                    ps.WriteLine(GenerateIndentString(indentLevel) + variableName + " = " + streamName + ".ReadHLAopaqueData();");
                }
            }
            else if (descriptorManager.ArrayDataTypeMap.ContainsKey(dataTypeName))
            {
                HLAarrayDataType arrData = descriptorManager.ArrayDataTypeMap[dataTypeName];

                if (arrData.HasNativeSerializer)
                {
                    ps.WriteLine(GenerateIndentString(indentLevel) + variableName + " = " + streamName + ".Read" + dataTypeName + "();");
                }
                else
                {
                    System.String nativeType  = NativeTypeForDataType(dataTypeName);
                    System.String preBracket  = nativeType.Substring(0, (nativeType.IndexOf((System.Char) ']')) - (0));
                    System.String postBracket = nativeType.Substring(nativeType.IndexOf((System.Char) ']'));

                    if (arrData.Cardinality.ToUpper().Equals("DYNAMIC"))
                    {
                        ps.WriteLine(GenerateIndentString(indentLevel) + variableName + " = new " + preBracket + " " + streamName + ".ReadHLAinteger32BE() " + postBracket + ";");
                        ps.WriteLine();
                        ps.WriteLine(GenerateIndentString(indentLevel) + "for(int " + iteratorVariable + "=0;" + iteratorVariable + "<" + variableName + ".Length;" + iteratorVariable + "++)");
                    }
                    else
                    {
                        ps.WriteLine(GenerateIndentString(indentLevel) + variableName + " = new " + preBracket + arrData.Cardinality + postBracket + ";");
                        ps.WriteLine();
                        ps.WriteLine(GenerateIndentString(indentLevel) + "for(int " + iteratorVariable + "=0;" + iteratorVariable + "<" + arrData.Cardinality + ";" + iteratorVariable + "++)");
                    }

                    ps.WriteLine(GenerateIndentString(indentLevel) + "{");
                    PrintDeserializationBlock(ps, indentLevel + 1, (char)(iteratorVariable + 1), arrData.DataType, variableName + "[" + iteratorVariable + "]", streamName);
                    ps.WriteLine(GenerateIndentString(indentLevel) + "}");
                }
            }
            else
            {
                if (dataTypeName.StartsWith("HLA") && !dataTypeName.EndsWith("[]") && !dataTypeName.EndsWith("]"))
                {
                    ps.WriteLine(GenerateIndentString(indentLevel) + variableName + " = " + dataTypeName + "XrtiSerializer.Deserialize(" + streamName + ");");
                }
                else
                {
                    if (dataTypeName.StartsWith("HLA") && !dataTypeName.EndsWith("[]") && !variableName.EndsWith("]"))
                    {
                        ps.WriteLine(GenerateIndentString(indentLevel) + variableName + " = " + dataTypeName + "XrtiSerializer.Deserialize(" + streamName + ");");
                    }
                    else
                    {
                        ps.WriteLine(GenerateIndentString(indentLevel) + variableName + " = " + dataTypeName + "XrtiSerializer.Deserialize(" + streamName + ");");
                    }
                }
            }
        }