114 lines
4.2 KiB
C#
114 lines
4.2 KiB
C#
|
//-----------------------------------------------------------------------------
|
||
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||
|
//-----------------------------------------------------------------------------
|
||
|
|
||
|
namespace System.Activities.DurableInstancing
|
||
|
{
|
||
|
using System;
|
||
|
using System.Collections;
|
||
|
using System.Collections.Generic;
|
||
|
using System.IO;
|
||
|
using System.Runtime.Serialization;
|
||
|
using System.Xml;
|
||
|
using System.Xml.Linq;
|
||
|
using System.Xml.Serialization;
|
||
|
|
||
|
class DefaultObjectSerializer : IObjectSerializer
|
||
|
{
|
||
|
NetDataContractSerializer serializer;
|
||
|
|
||
|
public DefaultObjectSerializer()
|
||
|
{
|
||
|
this.serializer = new NetDataContractSerializer();
|
||
|
}
|
||
|
|
||
|
public Dictionary<XName, object> DeserializePropertyBag(byte[] serializedValue)
|
||
|
{
|
||
|
using (MemoryStream memoryStream = new MemoryStream(serializedValue))
|
||
|
{
|
||
|
return this.DeserializePropertyBag(memoryStream);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public object DeserializeValue(byte[] serializedValue)
|
||
|
{
|
||
|
using (MemoryStream memoryStream = new MemoryStream(serializedValue))
|
||
|
{
|
||
|
return this.DeserializeValue(memoryStream);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public ArraySegment<byte> SerializePropertyBag(Dictionary<XName, object> value)
|
||
|
{
|
||
|
using (MemoryStream memoryStream = new MemoryStream(4096))
|
||
|
{
|
||
|
this.SerializePropertyBag(memoryStream, value);
|
||
|
return new ArraySegment<byte>(memoryStream.GetBuffer(), 0, Convert.ToInt32(memoryStream.Length));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public ArraySegment<byte> SerializeValue(object value)
|
||
|
{
|
||
|
using (MemoryStream memoryStream = new MemoryStream(4096))
|
||
|
{
|
||
|
this.SerializeValue(memoryStream, value);
|
||
|
return new ArraySegment<byte>(memoryStream.GetBuffer(), 0, Convert.ToInt32(memoryStream.Length));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
protected virtual Dictionary<XName, object> DeserializePropertyBag(Stream stream)
|
||
|
{
|
||
|
using (XmlDictionaryReader dictionaryReader = XmlDictionaryReader.CreateBinaryReader(stream, XmlDictionaryReaderQuotas.Max))
|
||
|
{
|
||
|
Dictionary<XName, object> propertyBag = new Dictionary<XName, object>();
|
||
|
|
||
|
if (dictionaryReader.ReadToDescendant("Property"))
|
||
|
{
|
||
|
do
|
||
|
{
|
||
|
dictionaryReader.Read();
|
||
|
KeyValuePair<XName, object> property = (KeyValuePair<XName, object>) this.serializer.ReadObject(dictionaryReader);
|
||
|
propertyBag.Add(property.Key, property.Value);
|
||
|
}
|
||
|
while (dictionaryReader.ReadToNextSibling("Property"));
|
||
|
}
|
||
|
|
||
|
return propertyBag;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
protected virtual object DeserializeValue(Stream stream)
|
||
|
{
|
||
|
using (XmlDictionaryReader dictionaryReader = XmlDictionaryReader.CreateBinaryReader(stream, XmlDictionaryReaderQuotas.Max))
|
||
|
{
|
||
|
return this.serializer.ReadObject(dictionaryReader);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
protected virtual void SerializePropertyBag(Stream stream, Dictionary<XName, object> propertyBag)
|
||
|
{
|
||
|
using (XmlDictionaryWriter dictionaryWriter = XmlDictionaryWriter.CreateBinaryWriter(stream, null, null, false))
|
||
|
{
|
||
|
dictionaryWriter.WriteStartElement("Properties");
|
||
|
|
||
|
foreach (KeyValuePair<XName, object> property in propertyBag)
|
||
|
{
|
||
|
dictionaryWriter.WriteStartElement("Property");
|
||
|
this.serializer.WriteObject(dictionaryWriter, property);
|
||
|
dictionaryWriter.WriteEndElement();
|
||
|
}
|
||
|
|
||
|
dictionaryWriter.WriteEndElement();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
protected virtual void SerializeValue(Stream stream, object value)
|
||
|
{
|
||
|
using (XmlDictionaryWriter dictionaryWriter = XmlDictionaryWriter.CreateBinaryWriter(stream, null, null, false))
|
||
|
{
|
||
|
this.serializer.WriteObject(dictionaryWriter, value);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|