public static ArraySegment <byte>[] SerializePropertyBag(IDictionary <XName, InstanceValue> properties, InstanceEncodingOption encodingOption) { ArraySegment <byte>[] dataArrays = new ArraySegment <byte> [4]; if (properties.Count > 0) { IObjectSerializer serializer = ObjectSerializerFactory.GetObjectSerializer(encodingOption); XmlPropertyBag primitiveProperties = new XmlPropertyBag(); XmlPropertyBag primitiveWriteOnlyProperties = new XmlPropertyBag(); Dictionary <XName, object> complexProperties = new Dictionary <XName, object>(); Dictionary <XName, object> complexWriteOnlyProperties = new Dictionary <XName, object>(); Dictionary <XName, object>[] propertyBags = new Dictionary <XName, object>[] { primitiveProperties, complexProperties, primitiveWriteOnlyProperties, complexWriteOnlyProperties }; foreach (KeyValuePair <XName, InstanceValue> property in properties) { bool isComplex = (XmlPropertyBag.GetPrimitiveType(property.Value.Value) == PrimitiveType.Unavailable); bool isWriteOnly = (property.Value.Options & InstanceValueOptions.WriteOnly) == InstanceValueOptions.WriteOnly; int index = (isWriteOnly ? 2 : 0) + (isComplex ? 1 : 0); propertyBags[index].Add(property.Key, property.Value.Value); } // Remove the properties that are already stored as individual columns from the serialized blob primitiveWriteOnlyProperties.Remove(SqlWorkflowInstanceStoreConstants.StatusPropertyName); primitiveWriteOnlyProperties.Remove(SqlWorkflowInstanceStoreConstants.LastUpdatePropertyName); primitiveWriteOnlyProperties.Remove(SqlWorkflowInstanceStoreConstants.PendingTimerExpirationPropertyName); complexWriteOnlyProperties.Remove(SqlWorkflowInstanceStoreConstants.BinaryBlockingBookmarksPropertyName); for (int i = 0; i < propertyBags.Length; i++) { if (propertyBags[i].Count > 0) { if (propertyBags[i] is XmlPropertyBag) { dataArrays[i] = serializer.SerializeValue(propertyBags[i]); } else { dataArrays[i] = serializer.SerializePropertyBag(propertyBags[i]); } } } } return(dataArrays); }
public static ArraySegment <byte>[] SerializePropertyBag(IDictionary <XName, InstanceValue> properties, InstanceEncodingOption encodingOption) { ArraySegment <byte>[] segmentArray = new ArraySegment <byte> [4]; if (properties.Count > 0) { IObjectSerializer objectSerializer = ObjectSerializerFactory.GetObjectSerializer(encodingOption); XmlPropertyBag bag = new XmlPropertyBag(); XmlPropertyBag bag2 = new XmlPropertyBag(); Dictionary <XName, object> dictionary = new Dictionary <XName, object>(); Dictionary <XName, object> dictionary2 = new Dictionary <XName, object>(); Dictionary <XName, object>[] dictionaryArray = new Dictionary <XName, object>[] { bag, dictionary, bag2, dictionary2 }; foreach (KeyValuePair <XName, InstanceValue> pair in properties) { bool flag = XmlPropertyBag.GetPrimitiveType(pair.Value.Value) == PrimitiveType.Unavailable; int index = (((pair.Value.Options & InstanceValueOptions.WriteOnly) == InstanceValueOptions.WriteOnly) ? 2 : 0) + (flag ? 1 : 0); dictionaryArray[index].Add(pair.Key, pair.Value.Value); } bag2.Remove(SqlWorkflowInstanceStoreConstants.StatusPropertyName); bag2.Remove(SqlWorkflowInstanceStoreConstants.LastUpdatePropertyName); bag2.Remove(SqlWorkflowInstanceStoreConstants.PendingTimerExpirationPropertyName); dictionary2.Remove(SqlWorkflowInstanceStoreConstants.BinaryBlockingBookmarksPropertyName); for (int i = 0; i < dictionaryArray.Length; i++) { if (dictionaryArray[i].Count > 0) { if (dictionaryArray[i] is XmlPropertyBag) { segmentArray[i] = objectSerializer.SerializeValue(dictionaryArray[i]); } else { segmentArray[i] = objectSerializer.SerializePropertyBag(dictionaryArray[i]); } } } } return(segmentArray); }