/// <summary> /// Serializes the specified stream. /// </summary> /// <param name="stream">The stream.</param> /// <param name="obj">The object.</param> /// <param name="objectMetaData">The object meta data.</param> /// <exception cref="System.ArgumentNullException">The <paramref name="stream"/> is <c>null</c>.</exception> /// <exception cref="System.ArgumentNullException">The <paramref name="objectMetaData"/> is <c>null</c>.</exception> public static void Serialize(Stream stream, object obj, IObjectMetaData objectMetaData) { Argument.IsNotNull("stream", stream); Argument.IsNotNull("objectMetaData", objectMetaData); if (obj == null || objectMetaData.DataType == DataType.Undefined) { Write(stream, "NuLl"); } else if (objectMetaData.DataType != DataType.Collection && objectMetaData.DataType != DataType.Object) { Write(stream, obj); } else if (objectMetaData.DataType == DataType.Collection) { var collection = obj as ICollection; if (collection == null) { return; } Write(stream, collection.Count); foreach (var item in collection) { Serialize(stream, item, objectMetaData.ChildObjMetaData); } } else { foreach (var propertyMetaData in objectMetaData.PropertiesMetaData) { Serialize(stream, propertyMetaData.PropertyInfo.GetValue(obj, null), propertyMetaData); } } }
/// <summary> /// Discovers the type information. /// </summary> /// <param name="objectType">Type of the object.</param> /// <param name="objectMetaData">The object meta data.</param> private static void DiscoverTypeInfo(Type objectType, IObjectMetaData objectMetaData) { while (true) { if (objectType == null) { return; } objectMetaData.Type = objectType; var dataType = GetType(objectType); if (dataType != DataType.Undefined) { return; } var collectionElementType = GetElementType(objectType); if (collectionElementType != null) { objectMetaData.DataType = DataType.Collection; objectMetaData.CollectionItemType = collectionElementType; objectMetaData.ChildObjMetaData = new ObjectMetaData(); objectType = collectionElementType; objectMetaData = objectMetaData.ChildObjMetaData; continue; } objectMetaData.DataType = DataType.Object; objectMetaData.PropertiesMetaData = new List <IObjectMetaData>(); foreach (var propertyInfo in objectType.GetProperties().OrderBy(property => property.Name)) { if (!propertyInfo.PropertyType.IsPublicEx() || propertyInfo.GetSetMethod() == null) { continue; } var propertyMetaData = new ObjectMetaData { PropertyInfo = propertyInfo }; DiscoverTypeInfo(propertyInfo.PropertyType, propertyMetaData); objectMetaData.PropertiesMetaData.Add(propertyMetaData); } break; } }
/// <summary> /// Decimals the serialize. /// </summary> /// <param name="stream">The stream.</param> /// <param name="objectMetaData">The object meta data.</param> /// <returns></returns> /// <exception cref="System.ArgumentNullException">The <paramref name="stream"/> is <c>null</c>.</exception> /// <exception cref="System.ArgumentNullException">The <paramref name="objectMetaData"/> is <c>null</c>.</exception> public static object DeSerialize(Stream stream, IObjectMetaData objectMetaData) { Argument.IsNotNull("stream", stream); Argument.IsNotNull("objectMetaData", objectMetaData); var position = stream.Position; if ((string)Read(stream, typeof(string)) == "NuLl" || objectMetaData.DataType == DataType.Undefined) { return(null); } if (objectMetaData.DataType != DataType.Collection && objectMetaData.DataType != DataType.Object) { stream.Position = position; return(Read(stream, objectMetaData.Type)); } var obj = TypeFactory.Default.CreateInstance(objectMetaData.Type); stream.Position = position; if (obj is ICollection) { var count = (int)Read(stream, typeof(int)); for (var i = 0; i < count; i++) { obj.GetType() .GetMethod("Add") .Invoke(obj, new[] { DeSerialize(stream, objectMetaData.ChildObjMetaData) }); } return(obj); } foreach (var propertyMetaData in objectMetaData.PropertiesMetaData) { propertyMetaData.PropertyInfo.SetValue(obj, DeSerialize(stream, propertyMetaData), null); } return(obj); }
/// <summary> /// Discovers the type information. /// </summary> /// <param name="objectType">Type of the object.</param> /// <param name="objectMetaData">The object meta data.</param> private static void DiscoverTypeInfo(Type objectType, IObjectMetaData objectMetaData) { while (true) { if (objectType == null) { return; } objectMetaData.Type = objectType; var dataType = GetType(objectType); if (dataType != DataType.Undefined) { return; } var collectionElementType = GetElementType(objectType); if (collectionElementType != null) { objectMetaData.DataType = DataType.Collection; objectMetaData.CollectionItemType = collectionElementType; objectMetaData.ChildObjMetaData = new ObjectMetaData(); objectType = collectionElementType; objectMetaData = objectMetaData.ChildObjMetaData; continue; } objectMetaData.DataType = DataType.Object; objectMetaData.PropertiesMetaData = new List<IObjectMetaData>(); foreach (var propertyInfo in objectType.GetProperties().OrderBy(property => property.Name)) { if (!propertyInfo.PropertyType.IsPublicEx() || propertyInfo.GetSetMethod() == null) { continue; } var propertyMetaData = new ObjectMetaData {PropertyInfo = propertyInfo}; DiscoverTypeInfo(propertyInfo.PropertyType, propertyMetaData); objectMetaData.PropertiesMetaData.Add(propertyMetaData); } break; } }
/// <summary> /// Decimals the serialize. /// </summary> /// <param name="stream">The stream.</param> /// <param name="objectMetaData">The object meta data.</param> /// <returns></returns> /// <exception cref="System.ArgumentNullException">The <paramref name="stream"/> is <c>null</c>.</exception> /// <exception cref="System.ArgumentNullException">The <paramref name="objectMetaData"/> is <c>null</c>.</exception> public static object DeSerialize(Stream stream, IObjectMetaData objectMetaData) { Argument.IsNotNull("stream", stream); Argument.IsNotNull("objectMetaData", objectMetaData); var position = stream.Position; if ((string) Read(stream, typeof (string)) == "NuLl" || objectMetaData.DataType == DataType.Undefined) { return null; } if (objectMetaData.DataType != DataType.Collection && objectMetaData.DataType != DataType.Object) { stream.Position = position; return Read(stream, objectMetaData.Type); } var obj = TypeFactory.Default.CreateInstance(objectMetaData.Type); stream.Position = position; if (obj is ICollection) { var count = (int) Read(stream, typeof (int)); for (var i = 0; i < count; i++) { obj.GetType() .GetMethod("Add") .Invoke(obj, new[] {DeSerialize(stream, objectMetaData.ChildObjMetaData)}); } return obj; } foreach (var propertyMetaData in objectMetaData.PropertiesMetaData) { propertyMetaData.PropertyInfo.SetValue(obj, DeSerialize(stream, propertyMetaData), null); } return obj; }