diff options
Diffstat (limited to 'Common-Source/XmlRpcCS/XmlRpcSerializer.cs')
-rw-r--r-- | Common-Source/XmlRpcCS/XmlRpcSerializer.cs | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/Common-Source/XmlRpcCS/XmlRpcSerializer.cs b/Common-Source/XmlRpcCS/XmlRpcSerializer.cs new file mode 100644 index 0000000..0643d38 --- /dev/null +++ b/Common-Source/XmlRpcCS/XmlRpcSerializer.cs | |||
@@ -0,0 +1,109 @@ | |||
1 | namespace Nwc.XmlRpc | ||
2 | { | ||
3 | using System; | ||
4 | using System.Collections; | ||
5 | using System.IO; | ||
6 | using System.Xml; | ||
7 | |||
8 | /// <summary>Base class of classes serializing data to XML-RPC's XML format.</summary> | ||
9 | /// <remarks>This class handles the basic type conversions like Integer to <i4>. </remarks> | ||
10 | /// <seealso cref="XmlRpcXmlTokens"/> | ||
11 | public class XmlRpcSerializer : XmlRpcXmlTokens | ||
12 | { | ||
13 | |||
14 | /// <summary>Serialize the <c>XmlRpcRequest</c> to the output stream.</summary> | ||
15 | /// <param name="output">An <c>XmlTextWriter</c> stream to write data to.</param> | ||
16 | /// <param name="obj">An <c>Object</c> to serialize.</param> | ||
17 | /// <seealso cref="XmlRpcRequest"/> | ||
18 | virtual public void Serialize(XmlTextWriter output, Object obj) | ||
19 | { | ||
20 | } | ||
21 | |||
22 | /// <summary>Serialize the <c>XmlRpcRequest</c> to a String.</summary> | ||
23 | /// <remarks>Note this may represent a real memory hog for a large request.</remarks> | ||
24 | /// <param name="obj">An <c>Object</c> to serialize.</param> | ||
25 | /// <returns><c>String</c> containing XML-RPC representation of the request.</returns> | ||
26 | /// <seealso cref="XmlRpcRequest"/> | ||
27 | public String Serialize(Object obj) | ||
28 | { | ||
29 | StringWriter strBuf = new StringWriter(); | ||
30 | XmlTextWriter xml = new XmlTextWriter(strBuf); | ||
31 | xml.Formatting = Formatting.Indented; | ||
32 | xml.Indentation = 4; | ||
33 | Serialize(xml, obj); | ||
34 | xml.Flush(); | ||
35 | String returns = strBuf.ToString(); | ||
36 | xml.Close(); | ||
37 | return returns; | ||
38 | } | ||
39 | |||
40 | /// <remarks>Serialize the object to the output stream.</remarks> | ||
41 | /// <param name="output">An <c>XmlTextWriter</c> stream to write data to.</param> | ||
42 | /// <param name="obj">An <c>Object</c> to serialize.</param> | ||
43 | public void SerializeObject(XmlTextWriter output, Object obj) | ||
44 | { | ||
45 | if (obj == null) | ||
46 | return; | ||
47 | |||
48 | if (obj is byte[]) | ||
49 | { | ||
50 | byte[] ba = (byte[])obj; | ||
51 | output.WriteStartElement(BASE64); | ||
52 | output.WriteBase64(ba, 0, ba.Length); | ||
53 | output.WriteEndElement(); | ||
54 | } | ||
55 | else if (obj is String) | ||
56 | { | ||
57 | output.WriteElementString(STRING, obj.ToString()); | ||
58 | } | ||
59 | else if (obj is Int32) | ||
60 | { | ||
61 | output.WriteElementString(INT, obj.ToString()); | ||
62 | } | ||
63 | else if (obj is DateTime) | ||
64 | { | ||
65 | output.WriteElementString(DATETIME, ((DateTime)obj).ToString(ISO_DATETIME)); | ||
66 | } | ||
67 | else if (obj is Double) | ||
68 | { | ||
69 | output.WriteElementString(DOUBLE, obj.ToString()); | ||
70 | } | ||
71 | else if (obj is Boolean) | ||
72 | { | ||
73 | output.WriteElementString(BOOLEAN, ((((Boolean)obj) == true) ? "1" : "0")); | ||
74 | } | ||
75 | else if (obj is IList) | ||
76 | { | ||
77 | output.WriteStartElement(ARRAY); | ||
78 | output.WriteStartElement(DATA); | ||
79 | if (((ArrayList)obj).Count > 0) | ||
80 | { | ||
81 | foreach (Object member in ((IList)obj)) | ||
82 | { | ||
83 | output.WriteStartElement(VALUE); | ||
84 | SerializeObject(output, member); | ||
85 | output.WriteEndElement(); | ||
86 | } | ||
87 | } | ||
88 | output.WriteEndElement(); | ||
89 | output.WriteEndElement(); | ||
90 | } | ||
91 | else if (obj is IDictionary) | ||
92 | { | ||
93 | IDictionary h = (IDictionary)obj; | ||
94 | output.WriteStartElement(STRUCT); | ||
95 | foreach (String key in h.Keys) | ||
96 | { | ||
97 | output.WriteStartElement(MEMBER); | ||
98 | output.WriteElementString(NAME, key); | ||
99 | output.WriteStartElement(VALUE); | ||
100 | SerializeObject(output, h[key]); | ||
101 | output.WriteEndElement(); | ||
102 | output.WriteEndElement(); | ||
103 | } | ||
104 | output.WriteEndElement(); | ||
105 | } | ||
106 | |||
107 | } | ||
108 | } | ||
109 | } | ||