How do I deserialize into an existing object - C#

后端 未结 4 1803
礼貌的吻别
礼貌的吻别 2020-12-18 23:42

In C#, after serializing an object to a file how would I deserialize the file back into an existing object without creating a new object?

All the examples I can fin

4条回答
  •  有刺的猬
    2020-12-18 23:52

    No problem, just use 2 classes. In getObject method you get your existing object

    [Serializable]
    public class McRealObjectHelper : IObjectReference, ISerializable 
    {
        Object m_realObject;
        virtual object getObject(McObjectId id)
        {
            return id.GetObject();
        }
        public McRealObjectHelper(SerializationInfo info, StreamingContext context)
        {
            McObjectId id = (McObjectId)info.GetValue("ID", typeof(McObjectId));
            m_realObject = getObject(id);
            if(m_realObject == null)
                return;
            Type t = m_realObject.GetType();
            MemberInfo[] members = FormatterServices.GetSerializableMembers(t, context);
            List deserializeMembers = new List(members.Length);
            List data = new List(members.Length);
            foreach(MemberInfo mi in members)
            {
                Type dataType = null;
                if(mi.MemberType == MemberTypes.Field)
                {
                    FieldInfo fi = mi as FieldInfo;
                    dataType = fi.FieldType;
                } else if(mi.MemberType == MemberTypes.Property){
                    PropertyInfo pi = mi as PropertyInfo;
                    dataType = pi.PropertyType;
                }
                try
                {
                    if(dataType != null){
                        data.Add(info.GetValue(mi.Name, dataType));
                        deserializeMembers.Add(mi);
                    }
                }
                catch (SerializationException)
                {
                    //some fiels are missing, new version, skip this fields
                }
            }
            FormatterServices.PopulateObjectMembers(m_realObject, deserializeMembers.ToArray(), data.ToArray());
        }
    
        public object GetRealObject( StreamingContext context )
        {
            return m_realObject;
        }
        [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.SerializationFormatter)]
        public void GetObjectData(SerializationInfo info, StreamingContext context)
        {
        }
    }
    
    public class McRealObjectBinder: SerializationBinder
    {
        String assemVer;
        String typeVer;
        public McRealObjectBinder(String asmName, String typeName)
        {
            assemVer = asmName;
            typeVer = typeName;
        }
        public override Type BindToType( String assemblyName, String typeName ) 
        {
            Type typeToDeserialize = null;
            if ( assemblyName.Equals( assemVer ) && typeName.Equals( typeVer ) )
            {
                return typeof(McRealObjectHelper);
            }
            typeToDeserialize = Type.GetType( String.Format(  "{0}, {1}", typeName, assemblyName ) );
            return typeToDeserialize;
        }
    }
    
    
    

    Then, when deserialize:

    BinaryFormatter bf = new BinaryFormatter(null, context);
    bf.Binder = new McRealObjectBinder(YourType.Assembly.FullName, YourType.FullName);
    bf.Deserialize(memStream);
    

    提交回复
    热议问题