示例#1
0
        /// <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);
        }
示例#2
0
        /// <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);
        }
示例#3
0
        /// <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);
        }
示例#4
0
        /// <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);
        }
示例#5
0
        /// <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);
        }