Ejemplo n.º 1
0
        private static void WriteElementTo(PmlElement element, Stream stream, Encoding encoding)
        {
            if (element == null)
            {
                WriteString(stream, encoding, "N;");
                return;
            }
            switch (element.Type)
            {
            case PmlType.Null:
                WriteString(stream, encoding, "N;");
                break;

            case PmlType.String:
                Byte[] bytes = encoding.GetBytes(element.ToString());
                WriteString(stream, encoding, "s:");
                WriteString(stream, encoding, bytes.Length.ToString());
                WriteString(stream, encoding, ":\"");
                stream.Write(bytes, 0, bytes.Length);
                WriteString(stream, encoding, "\";");
                break;

            case PmlType.Binary:
                bytes = element.ToByteArray();
                WriteString(stream, encoding, "s:");
                WriteString(stream, encoding, bytes.Length.ToString());
                WriteString(stream, encoding, ":\"");
                stream.Write(bytes, 0, bytes.Length);
                WriteString(stream, encoding, "\";");
                break;

            case PmlType.Integer:
                WriteString(stream, encoding, "i:");
                WriteString(stream, encoding, element.ToString());
                WriteString(stream, encoding, ";");
                break;

            case PmlType.Number:
                WriteString(stream, encoding, "d:");
                WriteString(stream, encoding, element.ToDouble().ToString("f", CultureInfo.InvariantCulture));
                WriteString(stream, encoding, ";");
                break;

            case PmlType.Dictionary:
                IDictionary <String, PmlElement> dict = (IDictionary <String, PmlElement>)element;
                WriteString(stream, encoding, "a:");
                WriteString(stream, encoding, dict.Count.ToString());
                WriteString(stream, encoding, ":{");
                foreach (KeyValuePair <String, PmlElement> item in dict)
                {
                    bytes = encoding.GetBytes(item.Key);
                    WriteString(stream, encoding, "s:");
                    WriteString(stream, encoding, bytes.Length.ToString());
                    WriteString(stream, encoding, ":\"");
                    stream.Write(bytes, 0, bytes.Length);
                    WriteString(stream, encoding, "\";");
                    WriteElementTo(item.Value, stream, encoding);
                }
                WriteString(stream, encoding, "}");
                break;

            case PmlType.Collection:
                ICollection <PmlElement> col = (ICollection <PmlElement>)element;
                WriteString(stream, encoding, "a:");
                WriteString(stream, encoding, col.Count.ToString());
                WriteString(stream, encoding, ":{");
                int i = 0;
                foreach (PmlElement item in col)
                {
                    WriteString(stream, encoding, "i:");
                    WriteString(stream, encoding, i.ToString());
                    WriteString(stream, encoding, ";");
                    WriteElementTo(item, stream, encoding);
                    i += 1;
                }
                WriteString(stream, encoding, "}");
                break;

            default:
                WriteString(stream, encoding, "N;");
                break;
            }
        }
Ejemplo n.º 2
0
        private static void WriteElementTo(PmlElement element, TextWriter stream)
        {
            if (element == null)
            {
                stream.Write("null");
                return;
            }
            switch (element.Type)
            {
            case PmlType.Null:
                stream.Write("null");
                break;

            case PmlType.String:
                WriteEscapedString(stream, element.ToString());
                break;

            case PmlType.Binary:
                stream.Write('"');
                foreach (Byte b in element.ToByteArray())
                {
                    if (b < ' ' || b == '"' || b == '\\')
                    {
                        WriteEscapedCharacter(stream, (Char)b);
                    }
                    else
                    {
                        stream.Write((Char)b);
                    }
                }
                stream.Write('"');
                break;

            case PmlType.Integer:
                stream.Write(element.ToInt64().ToString(CultureInfo.InvariantCulture));
                break;

            case PmlType.Number:
                stream.Write(element.ToDouble().ToString("f", CultureInfo.InvariantCulture));
                break;

            case PmlType.Boolean:
                stream.Write(element.ToBoolean() ? "true" : "false");
                break;

            case PmlType.Dictionary:
                IDictionary <String, PmlElement> dict = (IDictionary <String, PmlElement>)element;
                Boolean first = true;
                stream.Write('{');
                foreach (KeyValuePair <String, PmlElement> item in dict)
                {
                    if (!first)
                    {
                        stream.Write(',');
                    }
                    first = false;
                    WriteEscapedString(stream, item.Key);
                    stream.Write(':');
                    WriteElementTo(item.Value, stream);
                }
                stream.Write('}');
                break;

            case PmlType.Collection:
                IEnumerable <PmlElement> col = (IEnumerable <PmlElement>)element;
                first = true;
                stream.Write('[');
                foreach (PmlElement item in col)
                {
                    if (!first)
                    {
                        stream.Write(',');
                    }
                    first = false;
                    WriteElementTo(item, stream);
                }
                stream.Write(']');
                break;

            default:
                throw new InvalidOperationException("Can not encode PML type " + element.Type.ToString() + " to JSON");
            }
        }
Ejemplo n.º 3
0
        private static void WriteElementTo(PmlElement Element, BinaryWriter Writer)
        {
            if (Element == null)
            {
                Writer.Write((byte)0);
                return;
            }
            switch (Element.Type)
            {
            case PmlType.Null:
                Writer.Write((byte)0);
                break;

            case PmlType.Dictionary:
                Writer.Write((byte)1);
                foreach (KeyValuePair <string, PmlElement> Item in (PmlDictionary)Element)
                {
                    Writer.Write((byte)1);
                    Writer.Write(Item.Key);
                    WriteElementTo(Item.Value, Writer);
                }
                Writer.Write((byte)0);
                break;

            case PmlType.Collection:
                Writer.Write((byte)2);
                foreach (PmlElement Item in (PmlCollection)Element)
                {
                    Writer.Write((byte)1);
                    WriteElementTo(Item, Writer);
                }
                Writer.Write((byte)0);
                break;

            case PmlType.Binary: {
                Writer.Write((byte)10);
                Byte[] Buffer = Element.ToByteArray();
                if (Buffer == null)
                {
                    Writer.Write((int)0);
                }
                else
                {
                    Writer.Write((int)Buffer.Length);
                    Writer.Write(Buffer);
                }
            } break;

            case PmlType.String:
                Writer.Write((byte)11);
                string Str = Element.ToString();
                if (Str == null)
                {
                    Writer.Write(String.Empty);
                }
                else
                {
                    Writer.Write(Str);
                }

                break;

            case PmlType.Integer:
                Writer.Write((byte)20);
                PmlInteger RMInt = (PmlInteger)Element;
                if (RMInt.IsSigned)
                {
                    Writer.Write((byte)1);
                    Writer.Write((long)RMInt);
                }
                else
                {
                    Writer.Write((byte)0);
                    Writer.Write((ulong)RMInt);
                }
                break;

            case PmlType.Boolean:
                Writer.Write((byte)21);
                Writer.Write(Element.ToBoolean());
                break;

            case PmlType.Number:
                Writer.Write((byte)22);
                Writer.Write(Element.ToDouble());
                break;

            default:
                Writer.Write((byte)0);
                Console.WriteLine("PmlBinaryRW: Can not encode PML type {0}", Element.Type);
                break;
            }
        }