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; } }
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)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; } }