316 lines
9.9 KiB
C#
316 lines
9.9 KiB
C#
|
//----------------------------------------------------------------
|
|||
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|||
|
//----------------------------------------------------------------
|
|||
|
|
|||
|
namespace System.Activities.DurableInstancing
|
|||
|
{
|
|||
|
using System;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.Globalization;
|
|||
|
using System.IO;
|
|||
|
using System.IO.Compression;
|
|||
|
using System.Linq;
|
|||
|
using System.Runtime;
|
|||
|
using System.Text;
|
|||
|
using System.Xml;
|
|||
|
using System.Xml.Linq;
|
|||
|
using System.Xml.Schema;
|
|||
|
using System.Xml.Serialization;
|
|||
|
|
|||
|
class XmlPropertyBag : Dictionary<XName, object>, IXmlSerializable
|
|||
|
{
|
|||
|
public XmlPropertyBag()
|
|||
|
{
|
|||
|
}
|
|||
|
|
|||
|
public XmlSchema GetSchema()
|
|||
|
{
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
public void ReadXml(XmlReader reader)
|
|||
|
{
|
|||
|
if (reader.ReadToDescendant("Property"))
|
|||
|
{
|
|||
|
do
|
|||
|
{
|
|||
|
reader.MoveToFirstAttribute();
|
|||
|
XName propertyName = XName.Get(reader.Value);
|
|||
|
|
|||
|
reader.MoveToNextAttribute();
|
|||
|
PrimitiveType type = (PrimitiveType)Int32.Parse(reader.Value, CultureInfo.InvariantCulture);
|
|||
|
|
|||
|
reader.MoveToNextAttribute();
|
|||
|
object value = ConvertStringToNativeType(reader.Value, type);
|
|||
|
|
|||
|
this.Add(propertyName, value);
|
|||
|
}
|
|||
|
|
|||
|
while (reader.ReadToNextSibling("Property"));
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public void WriteXml(XmlWriter writer)
|
|||
|
{
|
|||
|
writer.WriteStartElement("Properties");
|
|||
|
|
|||
|
foreach (KeyValuePair<XName, object> property in this)
|
|||
|
{
|
|||
|
writer.WriteStartElement("Property");
|
|||
|
writer.WriteAttributeString("XName", property.Key.ToString());
|
|||
|
writer.WriteAttributeString("Type", ((int)GetPrimitiveType(property.Value)).ToString(CultureInfo.InvariantCulture));
|
|||
|
writer.WriteAttributeString("Value", ConvertNativeValueToString(property.Value));
|
|||
|
writer.WriteEndElement();
|
|||
|
}
|
|||
|
|
|||
|
writer.WriteEndElement();
|
|||
|
}
|
|||
|
|
|||
|
public static PrimitiveType GetPrimitiveType(object value)
|
|||
|
{
|
|||
|
if (value == null)
|
|||
|
{
|
|||
|
return PrimitiveType.Null;
|
|||
|
}
|
|||
|
else if (value is bool)
|
|||
|
{
|
|||
|
return PrimitiveType.Bool;
|
|||
|
}
|
|||
|
else if (value is byte)
|
|||
|
{
|
|||
|
return PrimitiveType.Byte;
|
|||
|
}
|
|||
|
else if (value is char)
|
|||
|
{
|
|||
|
return PrimitiveType.Char;
|
|||
|
}
|
|||
|
else if (value is DateTime)
|
|||
|
{
|
|||
|
return PrimitiveType.DateTime;
|
|||
|
}
|
|||
|
else if (value is DateTimeOffset)
|
|||
|
{
|
|||
|
return PrimitiveType.DateTimeOffset;
|
|||
|
}
|
|||
|
else if (value is decimal)
|
|||
|
{
|
|||
|
return PrimitiveType.Decimal;
|
|||
|
}
|
|||
|
else if (value is double)
|
|||
|
{
|
|||
|
return PrimitiveType.Double;
|
|||
|
}
|
|||
|
else if (value is float)
|
|||
|
{
|
|||
|
return PrimitiveType.Float;
|
|||
|
}
|
|||
|
else if (value is Guid)
|
|||
|
{
|
|||
|
return PrimitiveType.Guid;
|
|||
|
}
|
|||
|
else if (value is int)
|
|||
|
{
|
|||
|
return PrimitiveType.Int;
|
|||
|
}
|
|||
|
else if (value is long)
|
|||
|
{
|
|||
|
return PrimitiveType.Long;
|
|||
|
}
|
|||
|
else if (value is sbyte)
|
|||
|
{
|
|||
|
return PrimitiveType.SByte;
|
|||
|
}
|
|||
|
else if (value is short)
|
|||
|
{
|
|||
|
return PrimitiveType.Short;
|
|||
|
}
|
|||
|
else if (value is string)
|
|||
|
{
|
|||
|
return PrimitiveType.String;
|
|||
|
}
|
|||
|
else if (value is TimeSpan)
|
|||
|
{
|
|||
|
return PrimitiveType.TimeSpan;
|
|||
|
}
|
|||
|
else if (value is Type)
|
|||
|
{
|
|||
|
return PrimitiveType.Type;
|
|||
|
}
|
|||
|
else if (value is uint)
|
|||
|
{
|
|||
|
return PrimitiveType.UInt;
|
|||
|
}
|
|||
|
else if (value is ulong)
|
|||
|
{
|
|||
|
return PrimitiveType.ULong;
|
|||
|
}
|
|||
|
else if (value is Uri)
|
|||
|
{
|
|||
|
return PrimitiveType.Uri;
|
|||
|
}
|
|||
|
else if (value is ushort)
|
|||
|
{
|
|||
|
return PrimitiveType.UShort;
|
|||
|
}
|
|||
|
else if (value is XmlQualifiedName)
|
|||
|
{
|
|||
|
return PrimitiveType.XmlQualifiedName;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
return PrimitiveType.Unavailable;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public static object ConvertStringToNativeType(string value, PrimitiveType type)
|
|||
|
{
|
|||
|
switch (type)
|
|||
|
{
|
|||
|
case PrimitiveType.Bool:
|
|||
|
return XmlConvert.ToBoolean(value);
|
|||
|
case PrimitiveType.Byte:
|
|||
|
return XmlConvert.ToByte(value);
|
|||
|
case PrimitiveType.Char:
|
|||
|
return XmlConvert.ToChar(value);
|
|||
|
case PrimitiveType.DateTime:
|
|||
|
return XmlConvert.ToDateTime(value, XmlDateTimeSerializationMode.RoundtripKind);
|
|||
|
case PrimitiveType.DateTimeOffset:
|
|||
|
return XmlConvert.ToDateTimeOffset(value);
|
|||
|
case PrimitiveType.Decimal:
|
|||
|
return XmlConvert.ToDecimal(value);
|
|||
|
case PrimitiveType.Double:
|
|||
|
return XmlConvert.ToDouble(value);
|
|||
|
case PrimitiveType.Float:
|
|||
|
return float.Parse(value, CultureInfo.InvariantCulture);
|
|||
|
case PrimitiveType.Guid:
|
|||
|
return XmlConvert.ToGuid(value);
|
|||
|
case PrimitiveType.Int:
|
|||
|
return XmlConvert.ToInt32(value);
|
|||
|
case PrimitiveType.Long:
|
|||
|
return XmlConvert.ToInt64(value);
|
|||
|
case PrimitiveType.SByte:
|
|||
|
return XmlConvert.ToSByte(value);
|
|||
|
case PrimitiveType.Short:
|
|||
|
return XmlConvert.ToInt16(value);
|
|||
|
case PrimitiveType.String:
|
|||
|
return value;
|
|||
|
case PrimitiveType.TimeSpan:
|
|||
|
return XmlConvert.ToTimeSpan(value);
|
|||
|
case PrimitiveType.Type:
|
|||
|
return Type.GetType(value);
|
|||
|
case PrimitiveType.UInt:
|
|||
|
return XmlConvert.ToUInt32(value);
|
|||
|
case PrimitiveType.ULong:
|
|||
|
return XmlConvert.ToUInt64(value);
|
|||
|
case PrimitiveType.Uri:
|
|||
|
return new Uri(value);
|
|||
|
case PrimitiveType.UShort:
|
|||
|
return XmlConvert.ToUInt16(value);
|
|||
|
case PrimitiveType.XmlQualifiedName:
|
|||
|
return new XmlQualifiedName(value);
|
|||
|
case PrimitiveType.Null:
|
|||
|
case PrimitiveType.Unavailable:
|
|||
|
default:
|
|||
|
return null;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public static string ConvertNativeValueToString(object value)
|
|||
|
{
|
|||
|
if (value == null)
|
|||
|
{
|
|||
|
return null;
|
|||
|
}
|
|||
|
else if (value is bool)
|
|||
|
{
|
|||
|
return XmlConvert.ToString((bool)value);
|
|||
|
}
|
|||
|
else if (value is byte)
|
|||
|
{
|
|||
|
return XmlConvert.ToString((byte)value);
|
|||
|
}
|
|||
|
else if (value is char)
|
|||
|
{
|
|||
|
return XmlConvert.ToString((char)value);
|
|||
|
}
|
|||
|
else if (value is DateTime)
|
|||
|
{
|
|||
|
return XmlConvert.ToString((DateTime)value, XmlDateTimeSerializationMode.RoundtripKind);
|
|||
|
}
|
|||
|
else if (value is DateTimeOffset)
|
|||
|
{
|
|||
|
return XmlConvert.ToString((DateTimeOffset)value);
|
|||
|
}
|
|||
|
else if (value is decimal)
|
|||
|
{
|
|||
|
return XmlConvert.ToString((decimal)value);
|
|||
|
}
|
|||
|
else if (value is double)
|
|||
|
{
|
|||
|
return XmlConvert.ToString((double)value);
|
|||
|
}
|
|||
|
else if (value is float)
|
|||
|
{
|
|||
|
return ((float)value).ToString("r", CultureInfo.InvariantCulture);
|
|||
|
}
|
|||
|
else if (value is Guid)
|
|||
|
{
|
|||
|
return XmlConvert.ToString((Guid)value);
|
|||
|
}
|
|||
|
else if (value is int)
|
|||
|
{
|
|||
|
return XmlConvert.ToString((int)value);
|
|||
|
}
|
|||
|
else if (value is long)
|
|||
|
{
|
|||
|
return XmlConvert.ToString((long)value);
|
|||
|
}
|
|||
|
else if (value is sbyte)
|
|||
|
{
|
|||
|
return XmlConvert.ToString((sbyte)value);
|
|||
|
}
|
|||
|
else if (value is short)
|
|||
|
{
|
|||
|
return XmlConvert.ToString((short)value);
|
|||
|
}
|
|||
|
else if (value is string)
|
|||
|
{
|
|||
|
return (string)value;
|
|||
|
}
|
|||
|
else if (value is TimeSpan)
|
|||
|
{
|
|||
|
return XmlConvert.ToString((TimeSpan)value);
|
|||
|
}
|
|||
|
else if (value is Type)
|
|||
|
{
|
|||
|
return value.ToString();
|
|||
|
}
|
|||
|
else if (value is uint)
|
|||
|
{
|
|||
|
return XmlConvert.ToString((uint)value);
|
|||
|
}
|
|||
|
else if (value is ulong)
|
|||
|
{
|
|||
|
return XmlConvert.ToString((ulong)value);
|
|||
|
}
|
|||
|
else if (value is Uri)
|
|||
|
{
|
|||
|
return ((Uri)value).ToString();
|
|||
|
}
|
|||
|
else if (value is ushort)
|
|||
|
{
|
|||
|
return XmlConvert.ToString((ushort)value);
|
|||
|
}
|
|||
|
else if (value is XmlQualifiedName)
|
|||
|
{
|
|||
|
return ((XmlQualifiedName)value).ToString();
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
Fx.AssertAndThrow("Should never reach here");
|
|||
|
return null;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|