+2004-08-24 Lluis Sanchez Gual <lluis@ximian.com>
+
+ * SoapReader.cs: Serialize byte arrays using base64 encoding.
+ GetComponentType should always return the type if
+ specified, GetId can now be !=0 for base64 arrrays.
+ * SoapTypeMapper.cs: Register byte[] as base64 xml type.
+ * SoapWriter.cs: Handle base64 encoded byte arrays.
+
2004-06-10 Lluis Sanchez Gual <lluis@ximian.com>
* SoapWriter.cs: In SerializeArray, consider 1 a valid id.
private Type GetComponentType()\r
{\r
Type type = null;\r
- if(GetId() != 0) return typeof(string);\r
\r
string strValue = xmlReader["type", XmlSchema.InstanceNamespace];\r
- if(strValue == null) return null;\r
+ if(strValue == null) {\r
+ if(GetId() != 0) return typeof(string);\r
+ return null;\r
+ }\r
string[] strName = strValue.Split(':');\r
string namespaceURI = xmlReader.LookupNamespace(strName[0]);\r
type = mapper[new Element(string.Empty, strName[1], namespaceURI)];\r
\r
private object DeserializeArray(long id)\r
{\r
+ // Special case for base64 byte arrays\r
+ if (GetComponentType () == typeof(byte[])) {\r
+ byte[] data = Convert.FromBase64String (xmlReader.ReadElementString());\r
+ RegisterObject(id, data, null, 0, null, null);\r
+ return data;\r
+ }\r
+ \r
// Get the array properties\r
string strArrayType = xmlReader["arrayType", SoapTypeMapper.SoapEncodingNamespace];\r
string[] arrayInfo = strArrayType.Split(':','[',',',']');\r
indices[i] = array.GetLowerBound(i);\r
}\r
\r
-\r
// Deserialize the array items\r
int arrayDepth = xmlReader.Depth;\r
xmlReader.Read();\r
while(xmlReader.Depth > arrayDepth)\r
{\r
-\r
Type itemType = GetComponentType();\r
if(itemType == null) \r
itemType = array.GetType().GetElementType();\r
xmlNodeToTypeTable.Add(element, elementType.AssemblyQualifiedName);
typeToXmlNodeTable.Add(elementType.AssemblyQualifiedName, element);
-
+ element = new Element("base64", SoapEncodingNamespace);
+ elementType = typeof(byte[]);
+ xmlNodeToTypeTable.Add(element, elementType.AssemblyQualifiedName);
+ typeToXmlNodeTable.Add(elementType.AssemblyQualifiedName, element);
}
public static string GetXsdValue (object value)
Element xmlArrayType = _mapper[arrayType];\r
_xmlWriter.WriteStartElement(element.Prefix, element.LocalName, element.NamespaceURI);\r
if(currentArrayId > 0) Id(currentArrayId);\r
+ \r
+ if (arrayType == typeof(byte)) {\r
+ EncodeType (currentArray.GetType());\r
+ _xmlWriter.WriteString (Convert.ToBase64String ((byte[])currentArray));\r
+ _xmlWriter.WriteFullEndElement();\r
+ return;\r
+ }\r
\r
if(_xmlWriter.LookupPrefix(xmlArrayType.NamespaceURI) == null)\r
{\r