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; } }
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"); } }
private static void WriteElementTo(PmlElement Element, BinaryWriter Writer) { if (Element == null) { Writer.Write((byte)AmfDataType.Null); return; } switch (Element.Type) { case PmlType.Null: Writer.Write((byte)AmfDataType.Null); break; case PmlType.Dictionary: Writer.Write((byte)AmfDataType.UntypedObject); //WriteDictionary(Writer, (PmlDictionary)Element); WriteUntypedObject(Writer, (PmlDictionary)Element); break; case PmlType.Collection: Writer.Write((byte)AmfDataType.Array); WriteCollection(Writer, (PmlCollection)Element); break; case PmlType.Binary: Writer.Write((byte)AmfDataType.String); byte[] bytes = Element.ToByteArray(); if (bytes.Length > UInt16.MaxValue) { Writer.Write((byte)AmfDataType.String); WriteString(Writer, bytes); } else { Writer.Write((byte)AmfDataType.LongString); WriteLongString(Writer, bytes); } break; case PmlType.String: string str = Element.ToString(); if (str.Length < UInt16.MaxValue) { Writer.Write((byte)AmfDataType.String); WriteString(Writer, str); } else { Writer.Write((byte)AmfDataType.LongString); WriteLongString(Writer, str); } break; case PmlType.Integer: case PmlType.Number: Writer.Write((byte)AmfDataType.Number); WriteDouble(Writer, (Element as PmlInteger).ToDouble()); break; case PmlType.Boolean: Writer.Write((byte)AmfDataType.Boolean); Writer.Write((byte)(Element.ToBoolean() ? 1 : 0)); break; } }