| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395 |
- //-----------------------------------------------------------------------------
- // Copyright (c) Microsoft Corporation. All rights reserved.
- //-----------------------------------------------------------------------------
- namespace System.Runtime.Serialization
- {
- using System;
- using System.Xml;
- using System.Collections.Generic;
- using System.Globalization;
- public sealed class ExtensionDataObject
- {
- IList<ExtensionDataMember> members;
- #if USE_REFEMIT
- public ExtensionDataObject()
- #else
- internal ExtensionDataObject()
- #endif
- {
- }
- #if USE_REFEMIT
- public IList<ExtensionDataMember> Members
- #else
- internal IList<ExtensionDataMember> Members
- #endif
- {
- get { return members; }
- set { members = value; }
- }
- }
- #if USE_REFEMIT
- public class ExtensionDataMember
- #else
- internal class ExtensionDataMember
- #endif
- {
- string name;
- string ns;
- IDataNode value;
- int memberIndex;
- public string Name
- {
- get { return name; }
- set { name = value; }
- }
- public string Namespace
- {
- get { return ns; }
- set { ns = value; }
- }
- public IDataNode Value
- {
- get { return value; }
- set { this.value = value; }
- }
- public int MemberIndex
- {
- get { return memberIndex; }
- set { memberIndex = value; }
- }
- }
- #if USE_REFEMIT
- public interface IDataNode
- #else
- internal interface IDataNode
- #endif
- {
- Type DataType { get; }
- object Value { get; set; } // boxes for primitives
- string DataContractName { get; set; }
- string DataContractNamespace { get; set; }
- string ClrTypeName { get; set; }
- string ClrAssemblyName { get; set; }
- string Id { get; set; }
- bool PreservesReferences { get; }
- // NOTE: consider moving below APIs to DataNode<T> if IDataNode API is made public
- void GetData(ElementData element);
- bool IsFinalValue { get; set; }
- void Clear();
- }
- internal class DataNode<T> : IDataNode
- {
- protected Type dataType;
- T value;
- string dataContractName;
- string dataContractNamespace;
- string clrTypeName;
- string clrAssemblyName;
- string id = Globals.NewObjectId;
- bool isFinalValue;
- internal DataNode()
- {
- this.dataType = typeof(T);
- this.isFinalValue = true;
- }
- internal DataNode(T value)
- : this()
- {
- this.value = value;
- }
- public Type DataType
- {
- get { return dataType; }
- }
- public object Value
- {
- get { return value; }
- set { this.value = (T)value; }
- }
- bool IDataNode.IsFinalValue
- {
- get { return isFinalValue; }
- set { isFinalValue = value; }
- }
- public T GetValue()
- {
- return value;
- }
- #if NotUsed
- public void SetValue(T value)
- {
- this.value = value;
- }
- #endif
- public string DataContractName
- {
- get { return dataContractName; }
- set { dataContractName = value; }
- }
- public string DataContractNamespace
- {
- get { return dataContractNamespace; }
- set { dataContractNamespace = value; }
- }
- public string ClrTypeName
- {
- get { return clrTypeName; }
- set { clrTypeName = value; }
- }
- public string ClrAssemblyName
- {
- get { return clrAssemblyName; }
- set { clrAssemblyName = value; }
- }
- public bool PreservesReferences
- {
- get { return (Id != Globals.NewObjectId); }
- }
- public string Id
- {
- get { return id; }
- set { id = value; }
- }
- public virtual void GetData(ElementData element)
- {
- element.dataNode = this;
- element.attributeCount = 0;
- element.childElementIndex = 0;
- if (DataContractName != null)
- AddQualifiedNameAttribute(element, Globals.XsiPrefix, Globals.XsiTypeLocalName, Globals.SchemaInstanceNamespace, DataContractName, DataContractNamespace);
- if (ClrTypeName != null)
- element.AddAttribute(Globals.SerPrefix, Globals.SerializationNamespace, Globals.ClrTypeLocalName, ClrTypeName);
- if (ClrAssemblyName != null)
- element.AddAttribute(Globals.SerPrefix, Globals.SerializationNamespace, Globals.ClrAssemblyLocalName, ClrAssemblyName);
- }
- public virtual void Clear()
- {
- // dataContractName not cleared because it is used when re-serializing from unknown data
- clrTypeName = clrAssemblyName = null;
- }
- internal void AddQualifiedNameAttribute(ElementData element, string elementPrefix, string elementName, string elementNs, string valueName, string valueNs)
- {
- string prefix = ExtensionDataReader.GetPrefix(valueNs);
- element.AddAttribute(elementPrefix, elementNs, elementName, String.Format(CultureInfo.InvariantCulture, "{0}:{1}", prefix, valueName));
- bool prefixDeclaredOnElement = false;
- if (element.attributes != null)
- {
- for (int i = 0; i < element.attributes.Length; i++)
- {
- AttributeData attribute = element.attributes[i];
- if (attribute != null && attribute.prefix == Globals.XmlnsPrefix && attribute.localName == prefix)
- {
- prefixDeclaredOnElement = true;
- break;
- }
- }
- }
- if (!prefixDeclaredOnElement)
- element.AddAttribute(Globals.XmlnsPrefix, Globals.XmlnsNamespace, prefix, valueNs);
- }
- }
- internal class ClassDataNode : DataNode<object>
- {
- IList<ExtensionDataMember> members;
- internal ClassDataNode()
- {
- dataType = Globals.TypeOfClassDataNode;
- }
- internal IList<ExtensionDataMember> Members
- {
- get { return members; }
- set { members = value; }
- }
- public override void Clear()
- {
- base.Clear();
- members = null;
- }
- }
- internal class CollectionDataNode : DataNode<Array>
- {
- IList<IDataNode> items;
- string itemName;
- string itemNamespace;
- int size = -1;
- internal CollectionDataNode()
- {
- dataType = Globals.TypeOfCollectionDataNode;
- }
- internal IList<IDataNode> Items
- {
- get { return items; }
- set { items = value; }
- }
- internal string ItemName
- {
- get { return itemName; }
- set { itemName = value; }
- }
- internal string ItemNamespace
- {
- get { return itemNamespace; }
- set { itemNamespace = value; }
- }
- internal int Size
- {
- get { return size; }
- set { size = value; }
- }
- public override void GetData(ElementData element)
- {
- base.GetData(element);
- element.AddAttribute(Globals.SerPrefix, Globals.SerializationNamespace, Globals.ArraySizeLocalName, Size.ToString(NumberFormatInfo.InvariantInfo));
- }
- public override void Clear()
- {
- base.Clear();
- items = null;
- size = -1;
- }
- }
- internal class XmlDataNode : DataNode<object>
- {
- IList<XmlAttribute> xmlAttributes;
- IList<XmlNode> xmlChildNodes;
- XmlDocument ownerDocument;
- internal XmlDataNode()
- {
- dataType = Globals.TypeOfXmlDataNode;
- }
- internal IList<XmlAttribute> XmlAttributes
- {
- get { return xmlAttributes; }
- set { xmlAttributes = value; }
- }
- internal IList<XmlNode> XmlChildNodes
- {
- get { return xmlChildNodes; }
- set { xmlChildNodes = value; }
- }
- internal XmlDocument OwnerDocument
- {
- get { return ownerDocument; }
- set { ownerDocument = value; }
- }
- public override void Clear()
- {
- base.Clear();
- xmlAttributes = null;
- xmlChildNodes = null;
- ownerDocument = null;
- }
- }
- internal class ISerializableDataNode : DataNode<object>
- {
- string factoryTypeName;
- string factoryTypeNamespace;
- IList<ISerializableDataMember> members;
- internal ISerializableDataNode()
- {
- dataType = Globals.TypeOfISerializableDataNode;
- }
- internal string FactoryTypeName
- {
- get { return factoryTypeName; }
- set { factoryTypeName = value; }
- }
- internal string FactoryTypeNamespace
- {
- get { return factoryTypeNamespace; }
- set { factoryTypeNamespace = value; }
- }
- internal IList<ISerializableDataMember> Members
- {
- get { return members; }
- set { members = value; }
- }
- public override void GetData(ElementData element)
- {
- base.GetData(element);
- if (FactoryTypeName != null)
- AddQualifiedNameAttribute(element, Globals.SerPrefix, Globals.ISerializableFactoryTypeLocalName, Globals.SerializationNamespace, FactoryTypeName, FactoryTypeNamespace);
- }
- public override void Clear()
- {
- base.Clear();
- members = null;
- factoryTypeName = factoryTypeNamespace = null;
- }
- }
- internal class ISerializableDataMember
- {
- string name;
- IDataNode value;
- internal string Name
- {
- get { return name; }
- set { name = value; }
- }
- internal IDataNode Value
- {
- get { return value; }
- set { this.value = value; }
- }
- }
- }
|