/// <summary> /// Serializes the value using XML and stores it in the extension object. /// </summary> public ExtensionObject(ExpandedNodeId typeId, object value) { TypeId = typeId; StringBuilder buffer = new StringBuilder(); using (XmlWriter writer = XmlWriter.Create(buffer)) { DataContractSerializer serializer = new DataContractSerializer(value.GetType()); serializer.WriteObject(writer, value); } XmlDocument document = new XmlDocument(); document.InnerXml = buffer.ToString(); ExtensionObjectBody body = new ExtensionObjectBody(); body.Nodes = new XmlNode[] { document.DocumentElement }; Body = body; }
/// <summary> /// Parses an XML element and returns the value contained in it. /// </summary> private object ToObject(XmlElement element) { switch (element.Name) { case "Byte": { return(XmlConvert.ToByte(element.InnerText)); } case "SByte": { return(XmlConvert.ToSByte(element.InnerText)); } case "Int16": { return(XmlConvert.ToInt16(element.InnerText)); } case "UInt16": { return(XmlConvert.ToUInt16(element.InnerText)); } case "Int32": { return(XmlConvert.ToInt32(element.InnerText)); } case "UInt32": { return(XmlConvert.ToUInt32(element.InnerText)); } case "Int64": { return(XmlConvert.ToInt64(element.InnerText)); } case "UInt64": { return(XmlConvert.ToUInt64(element.InnerText)); } case "Single": { return(XmlConvert.ToSingle(element.InnerText)); } case "Double": { return(XmlConvert.ToDouble(element.InnerText)); } case "String": { return(element.InnerText); } case "DateTime": { return(XmlConvert.ToDateTime(element.InnerText, XmlDateTimeSerializationMode.Utc)); } case "NodeId": { XmlNode child = element.FirstChild; string id = null; if (GetValue(element, ref child, "Identifier", out id)) { return(new NodeId(id)); } break; } case "ExpandedNodeId": { XmlNode child = element.FirstChild; string id = null; if (GetValue(element, ref child, "Identifier", out id)) { return(new NodeId(id)); } break; } case "QualifiedName": { QualifiedName value = new QualifiedName(); XmlNode child = element.FirstChild; string namespaceIndex = null; if (GetValue(element, ref child, "NamespaceIndex", out namespaceIndex)) { value.NamespaceIndex = XmlConvert.ToUInt16(namespaceIndex); } string name = null; if (GetValue(element, ref child, "Name", out name)) { value.Name = name; } return(value); } case "LocalizedText": { LocalizedText value = new LocalizedText(); XmlNode child = element.FirstChild; string locale = null; if (GetValue(element, ref child, "Locale", out locale)) { value.Locale = locale; } string text = null; if (GetValue(element, ref child, "Text", out text)) { value.Text = text; } return(value); } case "StatusCode": { StatusCode value = new StatusCode(); XmlNode child = element.FirstChild; string code = null; if (GetValue(element, ref child, "Code", out code)) { value.Code = XmlConvert.ToUInt32(code);; } return(value); } case "ExtensionObject": { ExtensionObject value = new ExtensionObject(); XmlNode child = element.FirstChild; string typeId = null; if (GetValue(element, ref child, "TypeId", out typeId)) { value.TypeId = new ExpandedNodeId(typeId); } for (XmlNode node = child; node != null; node = node.NextSibling) { XmlElement element2 = child as XmlElement; if (element2 != null) { if (element2.Name == "Body") { ExtensionObjectBody body = new ExtensionObjectBody(); body.Nodes = new XmlNode[] { GetFirstElement(element2) }; value.Body = body; } break; } } return(value); } } return(null); }
/// <summary> /// Parses an XML element and returns the value contained in it. /// </summary> private object ToObject(XmlElement element) { switch (element.Name) { case "Byte": { return XmlConvert.ToByte(element.InnerText); } case "SByte": { return XmlConvert.ToSByte(element.InnerText); } case "Int16": { return XmlConvert.ToInt16(element.InnerText); } case "UInt16": { return XmlConvert.ToUInt16(element.InnerText); } case "Int32": { return XmlConvert.ToInt32(element.InnerText); } case "UInt32": { return XmlConvert.ToUInt32(element.InnerText); } case "Int64": { return XmlConvert.ToInt64(element.InnerText); } case "UInt64": { return XmlConvert.ToUInt64(element.InnerText); } case "Single": { return XmlConvert.ToSingle(element.InnerText); } case "Double": { return XmlConvert.ToDouble(element.InnerText); } case "String": { return element.InnerText; } case "DateTime": { return XmlConvert.ToDateTime(element.InnerText, XmlDateTimeSerializationMode.Utc); } case "NodeId": { XmlNode child = element.FirstChild; string id = null; if (GetValue(element, ref child, "Identifier", out id)) { return new NodeId(id); } break; } case "ExpandedNodeId": { XmlNode child = element.FirstChild; string id = null; if (GetValue(element, ref child, "Identifier", out id)) { return new NodeId(id); } break; } case "QualifiedName": { QualifiedName value = new QualifiedName(); XmlNode child = element.FirstChild; string namespaceIndex = null; if (GetValue(element, ref child, "NamespaceIndex", out namespaceIndex)) { value.NamespaceIndex = XmlConvert.ToUInt16(namespaceIndex); } string name = null; if (GetValue(element, ref child, "Name", out name)) { value.Name = name; } return value; } case "LocalizedText": { LocalizedText value = new LocalizedText(); XmlNode child = element.FirstChild; string locale = null; if (GetValue(element, ref child, "Locale", out locale)) { value.Locale = locale; } string text = null; if (GetValue(element, ref child, "Text", out text)) { value.Text = text; } return value; } case "StatusCode": { StatusCode value = new StatusCode(); XmlNode child = element.FirstChild; string code = null; if (GetValue(element, ref child, "Code", out code)) { value.Code = XmlConvert.ToUInt32(code); ; } return value; } case "ExtensionObject": { ExtensionObject value = new ExtensionObject(); XmlNode child = element.FirstChild; string typeId = null; if (GetValue(element, ref child, "TypeId", out typeId)) { value.TypeId = new ExpandedNodeId(typeId); } for (XmlNode node = child; node != null; node = node.NextSibling) { XmlElement element2 = child as XmlElement; if (element2 != null) { if (element2.Name == "Body") { ExtensionObjectBody body = new ExtensionObjectBody(); body.Nodes = new XmlNode[] { GetFirstElement(element2) }; value.Body = body; } break; } } return value; } } return null; }