/// <summary> /// Serializes an object into a SerializationInfo object. /// </summary> /// <param name="obj">Object to be serialized.</param> /// <returns></returns> public SerializationInfo SerializeObject(object obj) { SerializationInfo info; if (obj == null) { NullPlaceholder nullPlaceholder = new NullPlaceholder(); info = new SerializationInfo(_serializationReferences.Count + 1); _serializationReferences.Add(nullPlaceholder, info); info.TypeName = AssemblyNameTranslator.GetAssemblyQualifiedName(typeof(NullPlaceholder)); } else { var thisType = obj.GetType(); if (obj is System.Security.Claims.ClaimsPrincipal cp) { obj = new Security.CslaClaimsPrincipal(cp); thisType = obj.GetType(); } if (!thisType.IsSerializable) { throw new InvalidOperationException( string.Format(Resources.ObjectNotSerializableFormatted, thisType.FullName)); } if (!(obj is IMobileObject mobile)) { throw new InvalidOperationException( string.Format(Resources.MustImplementIMobileObject, thisType.Name)); } if (!_serializationReferences.TryGetValue(mobile, out info)) { info = new SerializationInfo(_serializationReferences.Count + 1); _serializationReferences.Add(mobile, info); info.TypeName = AssemblyNameTranslator.GetAssemblyQualifiedName(thisType); if (thisType.Equals(typeof(Security.CslaClaimsPrincipal))) { var principal = (Security.CslaClaimsPrincipal)obj; using (var buffer = new System.IO.MemoryStream()) { using (var writer = new System.IO.BinaryWriter(buffer)) { principal.WriteTo(writer); info.AddValue("s", buffer.ToArray()); } } } else { mobile.GetChildren(info, this); mobile.GetState(info); } } } return(info); }
/// <summary> /// Deserialize an object from DTO graph. /// </summary> ///<param name="deserialized">DTO grap to deserialize</param> /// <returns></returns> public object DeserializeAsDTO(List <SerializationInfo> deserialized) { _deserializationReferences = new Dictionary <int, IMobileObject>(); foreach (SerializationInfo info in deserialized) { var typeName = AssemblyNameTranslator.GetAssemblyQualifiedName(info.TypeName); Type type = GetTypeFromCache(typeName); if (type == null) { throw new SerializationException(string.Format( Resources.MobileFormatterUnableToDeserialize, typeName)); } else if (type == typeof(NullPlaceholder)) { _deserializationReferences.Add(info.ReferenceId, null); } else { #if (ANDROID || IOS) || NETFX_CORE IMobileObject mobile = (IMobileObject)Activator.CreateInstance(type); #else IMobileObject mobile = (IMobileObject)Activator.CreateInstance(type, true); #endif _deserializationReferences.Add(info.ReferenceId, mobile); ConvertEnumsFromIntegers(info); mobile.SetState(info); } } foreach (SerializationInfo info in deserialized) { IMobileObject mobile = _deserializationReferences[info.ReferenceId]; if (mobile != null) { mobile.SetChildren(info, this); } } foreach (SerializationInfo info in deserialized) { ISerializationNotification notifiable = _deserializationReferences[info.ReferenceId] as ISerializationNotification; if (notifiable != null) { notifiable.Deserialized(); } } return(_deserializationReferences.Count > 0 ? _deserializationReferences[1] : null); }
/// <summary> /// Serializes an object into a SerializationInfo object. /// </summary> /// <param name="obj">Object to be serialized.</param> /// <returns></returns> public SerializationInfo SerializeObject(object obj) { SerializationInfo info; if (obj == null) { NullPlaceholder nullPlaceholder = new NullPlaceholder(); info = new SerializationInfo(_serializationReferences.Count + 1); _serializationReferences.Add(nullPlaceholder, info); info.TypeName = AssemblyNameTranslator.GetAssemblyQualifiedName(typeof(NullPlaceholder)); } else { var thisType = obj.GetType(); if (!IsSerializable(thisType)) { throw new InvalidOperationException( string.Format(Resources.ObjectNotSerializableFormatted, thisType.FullName)); } var mobile = obj as IMobileObject; if (mobile == null) { throw new InvalidOperationException( string.Format(Resources.MustImplementIMobileObject, #if NETFX_CORE thisType.Name())); } #else thisType.Name)); #endif if (!_serializationReferences.TryGetValue(mobile, out info)) { info = new SerializationInfo(_serializationReferences.Count + 1); _serializationReferences.Add(mobile, info); info.TypeName = AssemblyNameTranslator.GetAssemblyQualifiedName(thisType); mobile.GetChildren(info, this); mobile.GetState(info); } } return(info); }
/// <summary> /// Deserialize an object from DTO graph. /// </summary> ///<param name="deserialized">DTO group to deserialize</param> /// <returns></returns> public object DeserializeAsDTO(List <SerializationInfo> deserialized) { _deserializationReferences = new Dictionary <int, IMobileObject>(); foreach (SerializationInfo info in deserialized) { var typeName = AssemblyNameTranslator.GetAssemblyQualifiedName(info.TypeName); Type type = GetTypeFromCache(typeName); if (type == null) { throw new SerializationException(string.Format( Resources.MobileFormatterUnableToDeserialize, typeName)); } else if (type == typeof(NullPlaceholder)) { _deserializationReferences.Add(info.ReferenceId, null); } else { #if !NET40 && !NET45 if (type.Equals(typeof(Security.CslaClaimsPrincipal))) { var state = info.GetValue <byte[]>("s"); using (var buffer = new System.IO.MemoryStream(state)) { using (var reader = new System.IO.BinaryReader(buffer)) { IMobileObject mobile = (IMobileObject) new Security.CslaClaimsPrincipal(reader); _deserializationReferences.Add(info.ReferenceId, mobile); } } } else { IMobileObject mobile = (IMobileObject)Activator.CreateInstance(type, true); _deserializationReferences.Add(info.ReferenceId, mobile); ConvertEnumsFromIntegers(info); mobile.SetState(info); } #else IMobileObject mobile = (IMobileObject)Activator.CreateInstance(type, true); _deserializationReferences.Add(info.ReferenceId, mobile); ConvertEnumsFromIntegers(info); mobile.SetState(info); #endif } } foreach (SerializationInfo info in deserialized) { IMobileObject mobile = _deserializationReferences[info.ReferenceId]; if (mobile != null) { mobile.SetChildren(info, this); } } foreach (SerializationInfo info in deserialized) { ISerializationNotification notifiable = _deserializationReferences[info.ReferenceId] as ISerializationNotification; if (notifiable != null) { notifiable.Deserialized(); } } return(_deserializationReferences.Count > 0 ? _deserializationReferences[1] : null); }
/// <summary> /// Serializes an object into a SerializationInfo object. /// </summary> /// <param name="obj">Object to be serialized.</param> /// <returns></returns> public SerializationInfo SerializeObject(object obj) { SerializationInfo info; if (obj == null) { NullPlaceholder nullPlaceholder = new NullPlaceholder(); info = new SerializationInfo(_serializationReferences.Count + 1); _serializationReferences.Add(nullPlaceholder, info); info.TypeName = AssemblyNameTranslator.GetAssemblyQualifiedName(typeof(NullPlaceholder)); } else { var thisType = obj.GetType(); if (!IsSerializable(thisType)) { throw new InvalidOperationException( string.Format(Resources.ObjectNotSerializableFormatted, thisType.FullName)); } var mobile = obj as IMobileObject; if (mobile == null) { throw new InvalidOperationException( string.Format(Resources.MustImplementIMobileObject, #if NETFX_CORE thisType.Name())); } #else thisType.Name)); #endif if (!_serializationReferences.TryGetValue(mobile, out info)) { info = new SerializationInfo(_serializationReferences.Count + 1); _serializationReferences.Add(mobile, info); info.TypeName = AssemblyNameTranslator.GetAssemblyQualifiedName(thisType); #if !NET40 && !NET45 && !WINDOWS_UWP && !NETSTANDARD1_5 && !NETSTANDARD1_6 && !PCL46 && !PCL259 if (thisType.Equals(typeof(Security.CslaClaimsPrincipal))) { var principal = (Security.CslaClaimsPrincipal)obj; using (var buffer = new System.IO.MemoryStream()) { using (var writer = new System.IO.BinaryWriter(buffer)) { principal.WriteTo(writer); info.AddValue("s", buffer.ToArray()); } } } else { mobile.GetChildren(info, this); mobile.GetState(info); } #else mobile.GetChildren(info, this); mobile.GetState(info); #endif } } return(info); }