コード例 #1
0
		/// <summary>
		/// Writes the specified <see cref="Duality.Serialization.MetaFormat.ArrayNode"/>, including possible child nodes.
		/// </summary>
		/// <param name="node"></param>
		protected void WriteArray(ArrayNode node)
		{
			if (node.Rank != 1) throw new ArgumentException("Non single-Rank arrays are not supported");
			
			this.writer.WriteAttributeString("type", node.TypeString);
			if (node.ObjId != 0) this.writer.WriteAttributeString("id", XmlConvert.ToString(node.ObjId));
			if (node.Rank != 1) this.writer.WriteAttributeString("rank", XmlConvert.ToString(node.Rank));

			
			if (node.PrimitiveData != null)
			{
				this.writer.WriteAttributeString("length", XmlConvert.ToString(node.PrimitiveData.Length));
				Array objAsArray = node.PrimitiveData;
				if (objAsArray is byte[])
				{
					byte[] byteArr = objAsArray as byte[];
					this.writer.WriteString(this.ByteArrayToString(byteArr));
				}
				else
				{
					SerializeType elemType = objAsArray.GetType().GetElementType().GetSerializeType();
					for (long l = 0; l < objAsArray.Length; l++)
						this.WriteObject(new PrimitiveNode(elemType.DataType, objAsArray.GetValue(l)));
				}
			}
			else
			{
				this.writer.WriteAttributeString("length", XmlConvert.ToString(node.SubNodes.Count()));
				foreach (DataNode subNode in node.SubNodes)
					this.WriteObject(subNode);
			}
		}
コード例 #2
0
		/// <summary>
		/// Writes the specified <see cref="Duality.Serialization.MetaFormat.ArrayNode"/>, including possible child nodes.
		/// </summary>
		/// <param name="node"></param>
		protected void WriteArray(ArrayNode node)
		{
			if (node.Rank != 1) throw new ArgumentException("Non single-Rank arrays are not supported");

			this.writer.Write(node.TypeString);
			this.writer.Write(node.ObjId);
			this.writer.Write(node.Rank);

			
			if (node.PrimitiveData != null)
			{
				this.writer.Write(node.PrimitiveData.Length);
				Array objAsArray = node.PrimitiveData;
				if		(objAsArray is bool[])		this.WriteArrayData(objAsArray as bool[]);
				else if (objAsArray is byte[])		this.WriteArrayData(objAsArray as byte[]);
				else if (objAsArray is sbyte[])		this.WriteArrayData(objAsArray as sbyte[]);
				else if (objAsArray is short[])		this.WriteArrayData(objAsArray as short[]);
				else if (objAsArray is ushort[])	this.WriteArrayData(objAsArray as ushort[]);
				else if (objAsArray is int[])		this.WriteArrayData(objAsArray as int[]);
				else if (objAsArray is uint[])		this.WriteArrayData(objAsArray as uint[]);
				else if (objAsArray is long[])		this.WriteArrayData(objAsArray as long[]);
				else if (objAsArray is ulong[])		this.WriteArrayData(objAsArray as ulong[]);
				else if (objAsArray is float[])		this.WriteArrayData(objAsArray as float[]);
				else if (objAsArray is double[])	this.WriteArrayData(objAsArray as double[]);
				else if (objAsArray is decimal[])	this.WriteArrayData(objAsArray as decimal[]);
				else if (objAsArray is char[])		this.WriteArrayData(objAsArray as char[]);
				else if (objAsArray is string[])	this.WriteArrayData(objAsArray as string[]);
			}
			else
			{
				this.writer.Write(node.SubNodes.Count());
				foreach (DataNode subNode in node.SubNodes)
					this.WriteObject(subNode);
			}
		}
コード例 #3
0
        /// <summary>
        /// Writes the specified <see cref="Duality.Serialization.MetaFormat.ArrayNode"/>, including possible child nodes.
        /// </summary>
        /// <param name="node"></param>
        protected void WriteArray(ArrayNode node)
        {
            if (node.Rank != 1)
            {
                throw new ArgumentException("Non single-Rank arrays are not supported");
            }

            this.writer.WriteAttributeString("type", node.TypeString);
            if (node.ObjId != 0)
            {
                this.writer.WriteAttributeString("id", XmlConvert.ToString(node.ObjId));
            }
            if (node.Rank != 1)
            {
                this.writer.WriteAttributeString("rank", XmlConvert.ToString(node.Rank));
            }


            if (node.PrimitiveData != null)
            {
                this.writer.WriteAttributeString("length", XmlConvert.ToString(node.PrimitiveData.Length));
                Array objAsArray = node.PrimitiveData;
                if (objAsArray is byte[])
                {
                    byte[] byteArr = objAsArray as byte[];
                    this.writer.WriteString(this.ByteArrayToString(byteArr));
                }
                else
                {
                    SerializeType elemType = objAsArray.GetType().GetElementType().GetSerializeType();
                    if (elemType.DataType == DataType.String)
                    {
                        for (long l = 0; l < objAsArray.Length; l++)
                        {
                            string str = (string)objAsArray.GetValue(l);
                            this.WriteObjectData(str != null ? new StringNode(str) : this.GetNullObject());
                        }
                    }
                    else
                    {
                        for (long l = 0; l < objAsArray.Length; l++)
                        {
                            this.WriteObjectData(new PrimitiveNode(elemType.DataType, objAsArray.GetValue(l)));
                        }
                    }
                }
            }
            else
            {
                this.writer.WriteAttributeString("length", XmlConvert.ToString(node.SubNodes.Count()));
                foreach (DataNode subNode in node.SubNodes)
                {
                    this.WriteObjectData(subNode);
                }
            }
        }
コード例 #4
0
ファイル: BinaryMetaFormatter.cs プロジェクト: ruzli/duality
        /// <summary>
        /// Reads an <see cref="Duality.Serialization.MetaFormat.ArrayNode"/>, including possible child nodes.
        /// </summary>
        /// <param name="node"></param>
        protected ArrayNode ReadArray()
        {
            string	arrTypeString	= this.reader.ReadString();
            uint	objId			= this.reader.ReadUInt32();
            int		arrRank			= this.reader.ReadInt32();
            int		arrLength		= this.reader.ReadInt32();
            Type	arrType			= ReflectionHelper.ResolveType(arrTypeString, false);

            ArrayNode result = new ArrayNode(arrTypeString, objId, arrRank, arrLength);

            // Prepare object reference
            this.idManager.Inject(result, objId);

            // Store primitive data block
            bool nonPrimitive = false;
            if (arrType != null)
            {
                Array arrObj = Array.CreateInstance(arrType.GetElementType(), arrLength);
                if		(arrObj is bool[])		this.ReadArrayData(arrObj as bool[]);
                else if (arrObj is byte[])		this.ReadArrayData(arrObj as byte[]);
                else if (arrObj is sbyte[])		this.ReadArrayData(arrObj as sbyte[]);
                else if (arrObj is short[])		this.ReadArrayData(arrObj as short[]);
                else if (arrObj is ushort[])	this.ReadArrayData(arrObj as ushort[]);
                else if (arrObj is int[])		this.ReadArrayData(arrObj as int[]);
                else if (arrObj is uint[])		this.ReadArrayData(arrObj as uint[]);
                else if (arrObj is long[])		this.ReadArrayData(arrObj as long[]);
                else if (arrObj is ulong[])		this.ReadArrayData(arrObj as ulong[]);
                else if (arrObj is float[])		this.ReadArrayData(arrObj as float[]);
                else if (arrObj is double[])	this.ReadArrayData(arrObj as double[]);
                else if (arrObj is decimal[])	this.ReadArrayData(arrObj as decimal[]);
                else if (arrObj is char[])		this.ReadArrayData(arrObj as char[]);
                else if (arrObj is string[])	this.ReadArrayData(arrObj as string[]);
                else
                    nonPrimitive = true;

                if (!nonPrimitive) result.PrimitiveData = arrObj;
            }
            else
                nonPrimitive = true;

            // Store other data as sub-nodes
            if (nonPrimitive)
            {
                for (int i = 0; i < arrLength; i++)
                {
                    DataNode child = this.ReadObjectData() as DataNode;
                    child.Parent = result;
                }
            }

            return result;
        }
コード例 #5
0
		/// <summary>
		/// Reads an <see cref="Duality.Serialization.MetaFormat.ArrayNode"/>, including possible child nodes.
		/// </summary>
		/// <param name="node"></param>
		protected ArrayNode ReadArray()
		{
			string	arrTypeString	= this.reader.GetAttribute("type");
			string	objIdString		= this.reader.GetAttribute("id");
			string	arrRankString	= this.reader.GetAttribute("rank");
			string	arrLengthString	= this.reader.GetAttribute("length");
			uint	objId			= objIdString == null ? 0 : XmlConvert.ToUInt32(objIdString);
			int		arrRank			= arrRankString == null ? 1 : XmlConvert.ToInt32(arrRankString);
			int		arrLength		= arrLengthString == null ? 0 : XmlConvert.ToInt32(arrLengthString);
			Type	arrType			= ReflectionHelper.ResolveType(arrTypeString, false);

			ArrayNode result = new ArrayNode(arrTypeString, objId, arrRank, arrLength);
			
			// Prepare object reference
			this.idManager.Inject(result, objId);

			// Store primitive data block
			bool nonPrimitive;
			if (arrType != null)
			{
				Array arrObj = Array.CreateInstance(arrType.GetElementType(), arrLength);

				if (arrObj is bool[] || 
					arrObj is byte[] || arrObj is sbyte[] || 
					arrObj is short[] || arrObj is ushort[] || 
					arrObj is int[] || arrObj is uint[] || 
					arrObj is long[] || arrObj is ulong[] || 
					arrObj is float[] || arrObj is double[] || 
					arrObj is decimal[] || 
					arrObj is char[] || arrObj is string[])
					nonPrimitive = false;
				else
					nonPrimitive = true;

				if (!nonPrimitive)
				{
					if (arrObj is byte[])
					{
						byte[] byteArr = arrObj as byte[];
						string binHexString = this.reader.ReadString();
						byte[] byteArr2 = this.StringToByteArray(binHexString);
						for (int l = 0; l < arrLength; l++)
							byteArr[l] = byteArr2[l];
					}
					else
					{
						for (int l = 0; l < arrLength; l++)
						{
							PrimitiveNode elemNode = this.ReadObject() as PrimitiveNode;
							if (arrObj != null) arrObj.SetValue(elemNode.PrimitiveValue, l);
						}
					}
					result.PrimitiveData = arrObj;
				}
			}
			else
				nonPrimitive = true;

			// Store other data as sub-nodes
			if (nonPrimitive)
			{
				for (int i = 0; i < arrLength; i++)
				{
					DataNode child = this.ReadObject() as DataNode;
					child.Parent = result;
				}
			}

			return result;
		}
コード例 #6
0
        /// <summary>
        /// Reads an <see cref="Duality.Serialization.MetaFormat.ArrayNode"/>, including possible child nodes.
        /// </summary>
        /// <param name="node"></param>
        protected ArrayNode ReadArray()
        {
            string arrTypeString = this.reader.ReadString();
            uint   objId         = this.reader.ReadUInt32();
            int    arrRank       = this.reader.ReadInt32();
            int    arrLength     = this.reader.ReadInt32();
            Type   arrType       = ReflectionHelper.ResolveType(arrTypeString, false);

            ArrayNode result = new ArrayNode(arrTypeString, objId, arrRank, arrLength);

            // Prepare object reference
            this.idManager.Inject(result, objId);

            // Store primitive data block
            bool nonPrimitive = false;

            if (arrType != null)
            {
                Array arrObj = Array.CreateInstance(arrType.GetElementType(), arrLength);
                if (arrObj is bool[])
                {
                    this.ReadArrayData(arrObj as bool[]);
                }
                else if (arrObj is byte[])
                {
                    this.ReadArrayData(arrObj as byte[]);
                }
                else if (arrObj is sbyte[])
                {
                    this.ReadArrayData(arrObj as sbyte[]);
                }
                else if (arrObj is short[])
                {
                    this.ReadArrayData(arrObj as short[]);
                }
                else if (arrObj is ushort[])
                {
                    this.ReadArrayData(arrObj as ushort[]);
                }
                else if (arrObj is int[])
                {
                    this.ReadArrayData(arrObj as int[]);
                }
                else if (arrObj is uint[])
                {
                    this.ReadArrayData(arrObj as uint[]);
                }
                else if (arrObj is long[])
                {
                    this.ReadArrayData(arrObj as long[]);
                }
                else if (arrObj is ulong[])
                {
                    this.ReadArrayData(arrObj as ulong[]);
                }
                else if (arrObj is float[])
                {
                    this.ReadArrayData(arrObj as float[]);
                }
                else if (arrObj is double[])
                {
                    this.ReadArrayData(arrObj as double[]);
                }
                else if (arrObj is decimal[])
                {
                    this.ReadArrayData(arrObj as decimal[]);
                }
                else if (arrObj is char[])
                {
                    this.ReadArrayData(arrObj as char[]);
                }
                else if (arrObj is string[])
                {
                    this.ReadArrayData(arrObj as string[]);
                }
                else
                {
                    nonPrimitive = true;
                }

                if (!nonPrimitive)
                {
                    result.PrimitiveData = arrObj;
                }
            }
            else
            {
                nonPrimitive = true;
            }

            // Store other data as sub-nodes
            if (nonPrimitive)
            {
                for (int i = 0; i < arrLength; i++)
                {
                    DataNode child = this.ReadObject() as DataNode;
                    child.Parent = result;
                }
            }

            return(result);
        }
コード例 #7
0
        /// <summary>
        /// Writes the specified <see cref="Duality.Serialization.MetaFormat.ArrayNode"/>, including possible child nodes.
        /// </summary>
        /// <param name="node"></param>
        protected void WriteArray(ArrayNode node)
        {
            if (node.Rank != 1)
            {
                throw new ArgumentException("Non single-Rank arrays are not supported");
            }

            this.writer.Write(node.TypeString);
            this.writer.Write(node.ObjId);
            this.writer.Write(node.Rank);


            if (node.PrimitiveData != null)
            {
                this.writer.Write(node.PrimitiveData.Length);
                Array objAsArray = node.PrimitiveData;
                if (objAsArray is bool[])
                {
                    this.WriteArrayData(objAsArray as bool[]);
                }
                else if (objAsArray is byte[])
                {
                    this.WriteArrayData(objAsArray as byte[]);
                }
                else if (objAsArray is sbyte[])
                {
                    this.WriteArrayData(objAsArray as sbyte[]);
                }
                else if (objAsArray is short[])
                {
                    this.WriteArrayData(objAsArray as short[]);
                }
                else if (objAsArray is ushort[])
                {
                    this.WriteArrayData(objAsArray as ushort[]);
                }
                else if (objAsArray is int[])
                {
                    this.WriteArrayData(objAsArray as int[]);
                }
                else if (objAsArray is uint[])
                {
                    this.WriteArrayData(objAsArray as uint[]);
                }
                else if (objAsArray is long[])
                {
                    this.WriteArrayData(objAsArray as long[]);
                }
                else if (objAsArray is ulong[])
                {
                    this.WriteArrayData(objAsArray as ulong[]);
                }
                else if (objAsArray is float[])
                {
                    this.WriteArrayData(objAsArray as float[]);
                }
                else if (objAsArray is double[])
                {
                    this.WriteArrayData(objAsArray as double[]);
                }
                else if (objAsArray is decimal[])
                {
                    this.WriteArrayData(objAsArray as decimal[]);
                }
                else if (objAsArray is char[])
                {
                    this.WriteArrayData(objAsArray as char[]);
                }
                else if (objAsArray is string[])
                {
                    this.WriteArrayData(objAsArray as string[]);
                }
            }
            else
            {
                this.writer.Write(node.SubNodes.Count());
                foreach (DataNode subNode in node.SubNodes)
                {
                    this.WriteObject(subNode);
                }
            }
        }
コード例 #8
0
        /// <summary>
        /// Reads an <see cref="Duality.Serialization.MetaFormat.ArrayNode"/>, including possible child nodes.
        /// </summary>
        /// <param name="node"></param>
        protected ArrayNode ReadArray()
        {
            string arrTypeString   = this.reader.GetAttribute("type");
            string objIdString     = this.reader.GetAttribute("id");
            string arrRankString   = this.reader.GetAttribute("rank");
            string arrLengthString = this.reader.GetAttribute("length");
            uint   objId           = objIdString == null ? 0 : XmlConvert.ToUInt32(objIdString);
            int    arrRank         = arrRankString == null ? 1 : XmlConvert.ToInt32(arrRankString);
            int    arrLength       = arrLengthString == null ? 0 : XmlConvert.ToInt32(arrLengthString);
            Type   arrType         = ReflectionHelper.ResolveType(arrTypeString, false);

            ArrayNode result = new ArrayNode(arrTypeString, objId, arrRank, arrLength);

            // Prepare object reference
            this.idManager.Inject(result, objId);

            // Store primitive data block
            bool nonPrimitive;

            if (arrType != null)
            {
                Array arrObj = Array.CreateInstance(arrType.GetElementType(), arrLength);

                if (arrObj is bool[] ||
                    arrObj is byte[] || arrObj is sbyte[] ||
                    arrObj is short[] || arrObj is ushort[] ||
                    arrObj is int[] || arrObj is uint[] ||
                    arrObj is long[] || arrObj is ulong[] ||
                    arrObj is float[] || arrObj is double[] ||
                    arrObj is decimal[] ||
                    arrObj is char[] || arrObj is string[])
                {
                    nonPrimitive = false;
                }
                else
                {
                    nonPrimitive = true;
                }

                if (!nonPrimitive)
                {
                    if (arrObj is byte[])
                    {
                        byte[] byteArr      = arrObj as byte[];
                        string binHexString = this.reader.ReadString();
                        byte[] byteArr2     = this.StringToByteArray(binHexString);
                        for (int l = 0; l < arrLength; l++)
                        {
                            byteArr[l] = byteArr2[l];
                        }
                    }
                    else
                    {
                        for (int l = 0; l < arrLength; l++)
                        {
                            DataNode elemNode = this.ReadObjectData() as DataNode;
                            if (arrObj != null)
                            {
                                if (elemNode is PrimitiveNode)
                                {
                                    arrObj.SetValue((elemNode as PrimitiveNode).PrimitiveValue, l);
                                }
                                else if (elemNode is StringNode)
                                {
                                    arrObj.SetValue((elemNode as StringNode).StringValue, l);
                                }
                            }
                        }
                    }
                    result.PrimitiveData = arrObj;
                }
            }
            else
            {
                nonPrimitive = true;
            }

            // Store other data as sub-nodes
            if (nonPrimitive)
            {
                for (int i = 0; i < arrLength; i++)
                {
                    DataNode child = this.ReadObjectData() as DataNode;
                    child.Parent = result;
                }
            }

            return(result);
        }