private void WriteObject(object graph)
        {
            _writer.WriteStartObject();
            _writer.WritePropertyName(ID_TYPE);
            _writer.WriteValue(graph.GetType().FullName);

            var members = FormatterServices.GetSerializableMembers(graph.GetType(), Context);
            var objs    = FormatterServices.GetObjectData(graph, members);

            for (int i = 0; i < objs.Length; i++)
            {
                _writer.WritePropertyName(members[i].Name);
                if (objs[i] == null)
                {
                    _writer.WriteValue(null);
                    continue;
                }
                else
                {
                    this.WriteValue(objs[i]);
                }
            }

            _writer.WriteEndObject();
        }
        // used by the server when an exception is thrown
        // by the called function
        internal ServerFault CreateServerFault(Exception e)
        {
            // it's really strange here
            // a ServerFault object has a private System.Exception member called *exception*
            // (have a look at a MS Soap message when an exception occurs on the server)
            // but there is not public .ctor with an Exception as parameter...????....
            // (maybe an internal one). So I searched another way...
            ServerFault sf = (ServerFault)FormatterServices.GetUninitializedObject(typeof(ServerFault));

            MemberInfo[] mi = FormatterServices.GetSerializableMembers(typeof(ServerFault), new StreamingContext(StreamingContextStates.All));

            FieldInfo fi;

            object[] mv = new object[mi.Length];
            for (int i = 0; i < mi.Length; i++)
            {
                fi = mi[i] as FieldInfo;
                if (fi != null && fi.FieldType == typeof(Exception))
                {
                    mv[i] = e;
                }
            }
            sf = (ServerFault)FormatterServices.PopulateObjectMembers(sf, mi, mv);

            return(sf);
        }
示例#3
0
    public object Deserialize(Stream serializationStream)
    {
        IList list;

        using (var sr = new StreamReader(serializationStream))
        {
            // Optional if reading headers! Example: UserId, FirstName, Title
            if (_firstLineIsHeaders)
            {
                string[] headers = GetHeader(sr);
            }
            var listType            = typeof(List <>);
            var constructedListType = listType.MakeGenericType(typeof(T));
            list = (IList)Activator.CreateInstance(constructedListType);
            while (sr.Peek() >= 0)
            {
                var      line      = sr.ReadLine();
                var      fieldData = line.Split(_delimiter);
                var      obj       = FormatterServices.GetUninitializedObject(typeof(T));
                var      members   = FormatterServices.GetSerializableMembers(obj.GetType(), Context);
                object[] data      = new object[members.Length];
                for (int i = 0; i < members.Length; ++i)
                {
                    FieldInfo fi = ((FieldInfo)members[i]);
                    data[i] = Convert.ChangeType(fieldData.ElementAt(i), fi.FieldType, CultureInfo.InvariantCulture);
                }
                list.Add((T)FormatterServices.PopulateObjectMembers(obj, members, data));
            }
        }
        return(list);
    }
示例#4
0
        void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
        {
            info.AddValue("text", _text);
            info.AddValue("alignment", _alignment);
            info.AddValue("lineAlignment", _lineAlignment);
            info.AddValue("trimming", _trimming);
            info.AddValue("wrap", _wrap);
            info.AddValue("vertical", _vertical);
            info.AddValue("readOnly", _readOnly);
            info.AddValue("autoSize", _autoSize);

            var fontConverter = new FontConverter();

            info.AddValue("_font", fontConverter.ConvertToString(_font));

            var thisType = typeof(LabelElement);
            var members  = FormatterServices.GetSerializableMembers(thisType, context);

            foreach (var member in members)
            {
                if (member.DeclaringType == thisType)
                {
                    continue;
                }
                info.AddValue(member.Name, ((FieldInfo)member).GetValue(this));
            }
        }
示例#5
0
    private static int CalcFieldCount(System.Type type)
    {
        MemberInfo[] members = FormatterServices.GetSerializableMembers(type);
        if (members.Length == 0)
        {
            return(1);
        }

        int fieldCount = 0;

        foreach (MemberInfo member in members)
        {
            FieldInfo fi = (FieldInfo)member;
            if (fi.FieldType.IsArray)
            {
                var seq               = (Sequence)System.Attribute.GetCustomAttribute(member, typeof(Sequence), true);
                var elementType       = fi.FieldType.GetElementType();
                int elementFieldCount = CalcFieldCount(elementType);
                fieldCount += seq.length * elementFieldCount;
            }
            else
            {
                fieldCount += 1;
            }
        }

        return(fieldCount);
    }
示例#6
0
        /// <summary>
        /// Gets settings class members to serialize
        /// </summary>
        /// <param name="in_type"></param>
        /// <returns></returns>
        protected MemberInfo[] GetSerializableMembers(Type in_type)
        {
            MemberInfo[] member_info;

            if (in_type.IsSerializable)
            {
                // if 'Serializable' attribute is defined -> select all 'serializable' members
                member_info = FormatterServices.GetSerializableMembers(in_type);
            }
            else
            {
                // if 'DataContract' attribute is specified -> select all members which has 'DataMember' attribute
                DataContractAttribute[] attributes = (DataContractAttribute[])in_type.GetCustomAttributes(typeof(DataContractAttribute), true);
                if (attributes != null && attributes.Length > 0)
                {
                    // get members with 'DataMember' attribute
                    MemberInfo[] field_info    = in_type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.SetField | BindingFlags.GetField).Where(p => p.GetCustomAttributes(typeof(DataMemberAttribute), true).Count() != 0).ToArray();
                    MemberInfo[] property_info = in_type.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.SetProperty | BindingFlags.GetProperty).Where(p => p.GetCustomAttributes(typeof(DataMemberAttribute), true).Count() != 0).ToArray();

                    member_info = field_info.Concat(property_info).ToArray();
                }
                else
                {
                    // no attribute specified -> select public members
                    member_info = in_type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.SetField | BindingFlags.GetField).Where(p => p.GetCustomAttributes(typeof(NonSerializedAttribute), true).Count() == 0).ToArray();
                    member_info = member_info.Concat(in_type.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.SetProperty | BindingFlags.GetProperty)).ToArray().Where(p => p.GetCustomAttributes(typeof(IgnoreDataMemberAttribute), true).Count() == 0).ToArray();
                }
            }

            // retrun member info
            return(member_info);
        }
        int ReadObject(BinaryReader reader, Type type, ref object obj, SerializeAsAttribute attr)
        {
            int size = 0;

            if (type.BaseType != _TypeOfObject)
            {
                size += ReadObject(reader, type.BaseType, ref obj, attr);
            }

            MemberInfo[] membersInfo = FormatterServices.GetSerializableMembers(type, _Contex);
            object[]     membersData = new object[membersInfo.Length];

            for (int i = 0; i < membersInfo.Length; i++)
            {
                MemberInfo memberInfo = membersInfo[i];
                Debug.Assert(memberInfo is FieldInfo);

                SerializeAsAttribute memberAttr = GetSerializeAsAttribute(type, obj, memberInfo);

                object memberData;
                Type   memberType = memberAttr.FieldType == null ? ((FieldInfo)memberInfo).FieldType : memberAttr.FieldType;

                size          += ReadMember(reader, memberType, out memberData, memberAttr);
                membersData[i] = memberData;

                obj = FormatterServices.PopulateObjectMembers(obj, membersInfo, membersData);
            }

            return(size);
        }
    private void WorkOnInstanceAndLocal_2()
    {
        MemberInfo[] ms = FormatterServices.GetSerializableMembers(typeof(int), new StreamingContext(StreamingContextStates.All));
        foreach (MemberInfo m in ms)
        {
            if (!m.DeclaringType.Equals(typeof(Int32)))
            {
                throw new Exception("Err_23947tsg! error");
            }
        }
        int i = 5;

        Object[] os = FormatterServices.GetObjectData(i, ms);
        if ((int)os[0] != 5)
        {
            throw new Exception("Err_32497g! error");
        }
        Object o  = FormatterServices.GetUninitializedObject(typeof(int));
        Object o1 = FormatterServices.PopulateObjectMembers(o, ms, os);

        if ((Int32)o1 != 5)
        {
            throw new Exception("Err_23947tsg! 2347sg");
        }
        Int32[] iS = { 1, 2, 3 };
        if (Buffer.ByteLength(iS) != 12)
        {
            throw new Exception("Err_10974! wrong result");
        }
        if (Buffer.GetByte(iS, 4) != 2)
        {
            throw new Exception("Err_23408! wrong result");
        }
    }
示例#9
0
 private void InitMemberInfo()
 {
     if (!_serObjectInfoInit.SeenBeforeTable.TryGetValue(_objectType, out _cache))
     {
         _cache = new SerializationObjectInfoCache(_objectType)
         {
             MemberInfos = FormatterServices.GetSerializableMembers(_objectType, _context)
         };
         int length = _cache.MemberInfos.Length;
         _cache.MemberNames = new string[length];
         _cache.MemberTypes = new Type[length];
         int index = 0;
         while (true)
         {
             if (index >= length)
             {
                 _serObjectInfoInit.SeenBeforeTable.Add(_objectType, _cache);
                 break;
             }
             _cache.MemberNames[index] = _cache.MemberInfos[index].Name;
             _cache.MemberTypes[index] = ((FieldInfo)_cache.MemberInfos[index]).FieldType;
             index++;
         }
     }
     if (_obj != null)
     {
         _memberData = FormatterServices.GetObjectData(_obj, _cache.MemberInfos);
     }
     _isNamed = true;
 }
示例#10
0
 private void InitMemberInfo()
 {
     this.cache = (SerObjectInfoCache)this.serObjectInfoInit.seenBeforeTable[this.objectType];
     if (this.cache == null)
     {
         this.cache                      = new SerObjectInfoCache();
         this.cache.memberInfos          = FormatterServices.GetSerializableMembers(this.objectType, this.context);
         this.count                      = this.cache.memberInfos.Length;
         this.cache.memberNames          = new string[this.count];
         this.cache.memberTypes          = new Type[this.count];
         this.cache.memberAttributeInfos = new SoapAttributeInfo[this.count];
         for (int i = 0; i < this.count; i++)
         {
             this.cache.memberNames[i]          = this.cache.memberInfos[i].Name;
             this.cache.memberTypes[i]          = this.GetMemberType(this.cache.memberInfos[i]);
             this.cache.memberAttributeInfos[i] = Attr.GetMemberAttributeInfo(this.cache.memberInfos[i], this.cache.memberNames[i], this.cache.memberTypes[i]);
         }
         this.cache.fullTypeName   = this.objectType.FullName;
         this.cache.assemblyString = this.objectType.Module.Assembly.FullName;
         this.serObjectInfoInit.seenBeforeTable.Add(this.objectType, this.cache);
     }
     this.memberData  = new object[this.cache.memberNames.Length];
     this.memberNames = new string[this.cache.memberNames.Length];
     this.isTyped     = true;
     this.isNamed     = true;
 }
示例#11
0
        private void DeserializeProxyMembers()
        {
            var proxyType = proxy.GetType();
            var members   = FormatterServices.GetSerializableMembers(proxyType);

            var deserializedMembers = new List <MemberInfo>();
            var deserializedValues  = new List <object>();

            for (var i = 0; i < members.Length; i++)
            {
                var member = members[i] as FieldInfo;
                // we get some inherited members...
                if (member.DeclaringType != proxyType)
                {
                    continue;
                }

                Debug.Assert(member != null);
                var value = info.GetValue(member.Name, member.FieldType);
                deserializedMembers.Add(member);
                deserializedValues.Add(value);
            }
            FormatterServices.PopulateObjectMembers(
                proxy,
                deserializedMembers.ToArray(),
                deserializedValues.ToArray()
                );
        }
        void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
        {
            Helpers.ThrowIfNull(info, "info");
            bool flag = context.State == StreamingContextStates.CrossAppDomain;

            if (!flag)
            {
                foreach (RecognizedPhrase alternate in Alternates)
                {
                    try
                    {
                        string          smlContent = alternate.SmlContent;
                        RecognizedAudio audio      = Audio;
                        if (alternate.Text == null || alternate.Homophones == null || alternate.Semantics == null || (smlContent == null && smlContent != null) || (audio == null && audio != null))
                        {
                            throw new SerializationException();
                        }
                    }
                    catch (NotSupportedException)
                    {
                    }
                }
            }
            Type type = GetType();

            MemberInfo[] serializableMembers = FormatterServices.GetSerializableMembers(type, context);
            MemberInfo[] array = serializableMembers;
            foreach (MemberInfo memberInfo in array)
            {
                if (!flag || (memberInfo.Name != "_recognizer" && memberInfo.Name != "_grammar" && memberInfo.Name != "_ruleList" && memberInfo.Name != "_audio" && memberInfo.Name != "_audio"))
                {
                    info.AddValue(memberInfo.Name, ((FieldInfo)memberInfo).GetValue(this));
                }
            }
        }
示例#13
0
    public void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        // Serialize the desired values for this class.
        info.AddValue("title", title);

        // Get the set of serializable members for the class and base classes.
        Type thisType = this.GetType();

        MemberInfo[] mi = FormatterServices.GetSerializableMembers(thisType, context);

        // Serialize the base class's fields to the info object.
        for (Int32 i = 0; i < mi.Length; i++)
        {
            // Do not serialize fields for this class.
            if (mi[i].DeclaringType == thisType)
            {
                continue;
            }

            // Skip this field if it is marked NonSerialized.
            if (Attribute.IsDefined(mi[i], typeof(NonSerializedAttribute)))
            {
                continue;
            }

            // Get the value of this field and add it to the SerializationInfo object.
            info.AddValue(mi[i].Name, ((FieldInfo)mi[i]).GetValue(this));
        }

        // Call the method below to see the contents of the SerializationInfo object.
        DisplaySerializationInfo(info);
    }
示例#14
0
    protected Manager(SerializationInfo info, StreamingContext context) : base(null)
    {
        // Get the set of serializable members for the class and base classes.
        Type thisType = this.GetType();

        MemberInfo[] mi = FormatterServices.GetSerializableMembers(thisType, context);

        // Deserialize the base class's fields from the info object.
        for (Int32 i = 0; i < mi.Length; i++)
        {
            // Do not deserialize fields for this class.
            if (mi[i].DeclaringType == thisType)
            {
                continue;
            }

            // For easier coding, treat the member as a FieldInfo object
            FieldInfo fi = (FieldInfo)mi[i];

            // Skip this field if it is marked NonSerialized.
            if (Attribute.IsDefined(mi[i], typeof(NonSerializedAttribute)))
            {
                continue;
            }

            // Get the value of this field from the SerializationInfo object.
            fi.SetValue(this, info.GetValue(fi.Name, fi.FieldType));
        }

        // Deserialize the values that were serialized for this class.
        title = info.GetString("title");
    }
示例#15
0
        static void Run()
        {
            // Create an instance of a Book class
            // with a title and author.
            Book Book1 = new Book("Book Title 1",
                                  "Masato Kawai");

            // Store data about the serializable members in a
            // MemberInfo array. The MemberInfo type holds
            // only type data, not instance data.
            MemberInfo[] members =
                FormatterServices.GetSerializableMembers
                    (typeof(Book));

            // Copy the data from the first book into an
            // array of objects.
            object[] data =
                FormatterServices.GetObjectData(Book1, members);

            // Create an uninitialized instance of the Book class.
            Book Book1Copy =
                (Book)FormatterServices.GetSafeUninitializedObject
                    (typeof(Book));

            // Call the PopuluateObjectMembers to copy the
            // data into the new Book instance.
            FormatterServices.PopulateObjectMembers
                (Book1Copy, members, data);

            // Print the data from the copy.
            Console.WriteLine("Title: {0}", Book1Copy.Title);
            Console.WriteLine("Author: {0}", Book1Copy.Author);
        }
示例#16
0
        private void InitMemberInfo()
        {
            InternalST.Soap(this, objectInfoId, " ", objectType, " InitMemberInfo Entry");

            cache = (SerObjectInfoCache)serObjectInfoInit.seenBeforeTable[objectType];
            if (cache == null)
            {
                InternalST.Soap(this, objectInfoId, " ", objectType, " InitMemberInfo new cache");
                cache                      = new SerObjectInfoCache();
                cache.memberInfos          = FormatterServices.GetSerializableMembers(objectType, context);
                count                      = cache.memberInfos.Length;
                cache.memberNames          = new String[count];
                cache.memberTypes          = new Type[count];
                cache.memberAttributeInfos = new SoapAttributeInfo[count];

                // Calculate new arrays
                for (int i = 0; i < count; i++)
                {
                    cache.memberNames[i]          = cache.memberInfos[i].Name;
                    cache.memberTypes[i]          = GetMemberType(cache.memberInfos[i]);
                    cache.memberAttributeInfos[i] = Attr.GetMemberAttributeInfo(cache.memberInfos[i], cache.memberNames[i], cache.memberTypes[i]);
                    InternalST.Soap(this, objectInfoId, " InitMemberInfo name ", cache.memberNames[i], ", type ", cache.memberTypes[i], ", memberInfoType ", cache.memberInfos[i].GetType());
                }
                cache.fullTypeName   = objectType.FullName;
                cache.assemblyString = objectType.Module.Assembly.FullName;
                serObjectInfoInit.seenBeforeTable.Add(objectType, cache);
            }
            memberData  = new Object[cache.memberNames.Length];
            memberNames = new String[cache.memberNames.Length];

            isTyped = true;
            isNamed = true;
            InternalST.Soap(this, objectInfoId, " ", objectType, " InitMemberInfo Exit");
        }
    private static bool Bug()
    {
        ObjectManager     objmgr1;
        StreamingContext  sc1;
        ObjectIDGenerator objid1;
        TestFixup         tstfxp1;
        Int64             iRootID;
        Int64             iChildID;
        String            strValue;

        MemberInfo[] members;
        Boolean      fFirstTime;

        sc1      = new StreamingContext(StreamingContextStates.All);
        tstfxp1  = new TestFixup();
        strValue = "Hello World";
        objid1   = new ObjectIDGenerator();
        iRootID  = objid1.GetId(tstfxp1, out fFirstTime);
        iChildID = objid1.GetId(strValue, out fFirstTime);
        members  = FormatterServices.GetSerializableMembers(tstfxp1.GetType());
        objmgr1  = new ObjectManager(null, sc1);
        objmgr1.RecordFixup(iRootID, members[0], iChildID);
        try {
            objmgr1.RegisterObject(strValue, iChildID);
            return(true);
        } catch (Exception ex) {
            Console.WriteLine("Bug:Exception thrown, " + ex);
            return(false);
        }
    }
        // Always remember: the whole configuration must be serialized as one single, flat object (or SerializationInfo), we cannot rely on any
        // nested objects to be deserialized in the right order
        public static void GetObjectDataForGeneratedTypes(
            SerializationInfo info,
            StreamingContext context,
            object mixin,
            ConcreteMixinTypeIdentifier identifier,
            bool serializeBaseMembers,
            string pipelineIdentifier)
        {
            ArgumentUtility.CheckNotNull("info", info);
            ArgumentUtility.CheckNotNull("mixin", mixin);
            ArgumentUtility.CheckNotNull("identifier", identifier);

            info.SetType(typeof(MixinSerializationHelper));

            var identifierSerializer = new SerializationInfoConcreteMixinTypeIdentifierSerializer(info, "__identifier");

            identifier.Serialize(identifierSerializer);

            object[] baseMemberValues;
            if (serializeBaseMembers)
            {
                var baseType = mixin.GetType().BaseType;
                Assertion.IsNotNull(baseType, "Generated mixin types always have a base type.");
                MemberInfo[] baseMembers = FormatterServices.GetSerializableMembers(baseType);
                baseMemberValues = FormatterServices.GetObjectData(mixin, baseMembers);
            }
            else
            {
                baseMemberValues = null;
            }

            info.AddValue("__baseMemberValues", baseMemberValues);
            info.AddValue("__participantConfigurationID", pipelineIdentifier);
        }
        int WriteObject(BinaryWriter writer, Type type, object obj, SerializeAsAttribute attr)
        {
            int size = 0;

            if (type.BaseType != _TypeOfObject)
            {
                size += WriteObject(writer, type.BaseType, obj, attr);
            }

            MemberInfo[] membersInfo = FormatterServices.GetSerializableMembers(type, _Contex);
            object[]     membersData = FormatterServices.GetObjectData(obj, membersInfo);
            Debug.Assert(membersInfo.Length == membersData.Length);

            for (int i = 0; i < membersInfo.Length; i++)
            {
                MemberInfo memberInfo = membersInfo[i];
                Debug.Assert(memberInfo is FieldInfo);

                object memberData = membersData[i];
                Type   memberType = memberData != null?memberData.GetType() : ((FieldInfo)memberInfo).FieldType;

                SerializeAsAttribute memberAttr = GetSerializeAsAttribute(type, obj, memberInfo);

                size += WriteMember(writer, memberType, memberData, memberAttr);
            }

            return(size);
        }
        private DerivedSerialize(SerializationInfo info, StreamingContext context)
        {
            if (info == null)
            {
                return;
            }
            //为本类设置反序列化好的值
            m_name = info.GetDateTime("date");

            //base.m_name = info.GetString(String.Format("{0}.{1}", this.GetType().BaseType.FullName, "m_Name"));

            //查找基类的可序列化字段集合
            Type baseType = this.GetType().BaseType;

            MemberInfo[] members = FormatterServices.GetSerializableMembers(baseType, context);
            foreach (MemberInfo mi in members)
            {
                if ((mi.MemberType & MemberTypes.Field) != 0)
                {
                    //为基类设置反序列化好的值
                    FieldInfo fi = (FieldInfo)mi;
                    fi.SetValue(this, info.GetValue(baseType.FullName + "+" + mi.Name, fi.FieldType));
                }
            }
        }
示例#21
0
        protected LabelElement(SerializationInfo info, StreamingContext context)
        {
            var thisType = typeof(LabelElement);
            var members  = FormatterServices.GetSerializableMembers(thisType, context);

            foreach (var member in members)
            {
                if (member.DeclaringType == thisType)
                {
                    continue;
                }

                var fieldInfo = (FieldInfo)member;
                fieldInfo.SetValue(this, info.GetValue(fieldInfo.Name, fieldInfo.FieldType));
            }

            Text          = info.GetString("text");
            Alignment     = (StringAlignment)info.GetValue("alignment", typeof(StringAlignment));
            LineAlignment = (StringAlignment)info.GetValue("lineAlignment", typeof(StringAlignment));
            Trimming      = (StringTrimming)info.GetValue("trimming", typeof(StringTrimming));
            Wrap          = info.GetBoolean("wrap");
            Vertical      = info.GetBoolean("vertical");
            ReadOnly      = info.GetBoolean("readOnly");
            AutoSize      = info.GetBoolean("autoSize");

            var fontConverter = new FontConverter();

            Font = (Font)fontConverter.ConvertFromString(info.GetString("_font"));
        }
示例#22
0
        /// <summary>
        /// Shallow copy |instance| to |copy|. Use with care.
        ///
        /// (This covers the case where we want to shallow copy into an existing object,
        ///  which is not handled by Object.MemberwiseCopy).
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="copy"></param>
        /// <param name="instance"></param>
        /// <returns></returns>
        public static void Copy <T>(T copy, T instance)
        {
            var type   = instance.GetType();
            var fields = new List <MemberInfo>();

            if (type.GetCustomAttributes(typeof(SerializableAttribute), false).Length == 0)
            {
                var t = type;
                while (t != typeof(Object))
                {
                    Debug.Assert(t != null, "t != null");
                    fields.AddRange(
                        t.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance |
                                    BindingFlags.DeclaredOnly));
                    t = t.BaseType;
                }
            }
            else
            {
                fields.AddRange(FormatterServices.GetSerializableMembers(instance.GetType()));
            }
            var values = FormatterServices.GetObjectData(instance, fields.ToArray());

            FormatterServices.PopulateObjectMembers(copy, fields.ToArray(), values);
        }
示例#23
0
    static int ReadMember(object obj, MemberInfo member, string[] fields, int fieldIndex)
    {
        FieldInfo fi = (FieldInfo)member;

        if (fi.FieldType.IsArray)
        {
            var elementType = fi.FieldType.GetElementType();
            var seq         = (Sequence)System.Attribute.GetCustomAttribute(fi, typeof(Sequence), true);
            var array       = (IList)System.Array.CreateInstance(elementType, seq.length);
            fi.SetValue(obj, array);
            var elementMembers = FormatterServices.GetSerializableMembers(elementType);
            for (int i = 0; i < array.Count; ++i)
            {
                if (elementMembers.Length == 0)
                {
                    array[i] = CastValue(fields[fieldIndex], elementType, array[i]);
                    ++fieldIndex;
                }
                else
                {
                    object element = System.Activator.CreateInstance(elementType);
                    fieldIndex = ReadObject(element, elementMembers, fields, fieldIndex);
                    array[i]   = element;
                }
            }
        }
        else
        {
            var value = CastValue(fields[fieldIndex], fi.FieldType, fi.GetValue(obj));
            fi.SetValue(obj, value);
            ++fieldIndex;
        }

        return(fieldIndex);
    }
        public void GetBaseData(SerializationInfo info, StreamingContext context, object proxy, System.Type proxyBaseType)
        {
            if (proxyBaseType == null)
            {
                throw new ArgumentNullException(nameof(proxyBaseType));
            }

            info.AddValue(HasAdditionalDataName, true);

            var members = FormatterServices.GetSerializableMembers(proxyBaseType, context);

            foreach (var member in members)
            {
                switch (member)
                {
                case FieldInfo field:
                    info.AddValue(GetAdditionalMemberName(field), field.GetValue(proxy));
                    break;

                case PropertyInfo property:
                    info.AddValue(GetAdditionalMemberName(property), property.GetValue(proxy));
                    break;

                default:
                    throw new NotSupportedException($"Serializing a member of type {member.GetType()} is not supported.");
                }
            }
        }
示例#25
0
        private void InitMemberInfo()
        {
            SerTrace.Log(this, objectInfoId, " ", objectType, " InitMemberInfo Entry");

            SerTrace.Log(this, objectInfoId, " ", objectType, " InitMemberInfo new cache");
            cache             = new SerObjectInfoCache();
            cache.memberInfos = FormatterServices.GetSerializableMembers(objectType, context);
            count             = cache.memberInfos.Length;
            cache.memberNames = new String[count];
            cache.memberTypes = new Type[count];

            // Calculate new arrays
            for (int i = 0; i < count; i++)
            {
                cache.memberNames[i] = cache.memberInfos[i].Name;
                cache.memberTypes[i] = GetMemberType(cache.memberInfos[i]);
                SerTrace.Log(this, objectInfoId, " InitMemberInfo name ", cache.memberNames[i], ", type ", cache.memberTypes[i], ", memberInfoType ", cache.memberInfos[i].GetType());
            }
            cache.fullTypeName   = objectType.FullName;
            cache.assemblyString = objectType.Module.Assembly.FullName;

            isTyped = true;
            isNamed = true;
            SerTrace.Log(this, objectInfoId, " ", objectType, " InitMemberInfo Exit");
        }
示例#26
0
        private SerializationStatus DeserializeSerializable(SerializationInstance instance, Type t, SerializationInfo info, StreamingContext context)
        {
            object obj = FormatterServices.GetUninitializedObject(t);

            InvokeOnSerialize(obj, context, false, false);

            if (typeof(ISerializable).IsAssignableFrom(t) && TryDeserializeISerializable(obj, info, context))
            {
                InvokeOnSerialize(obj, context, false, true);
                return(SerializationStatus.Deserialized(obj));
            }

            Dictionary <string, MemberInfo> map = FormatterServices.GetSerializableMembers(t, context).ToDictionary(m => m.Name);

            List <MemberInfo> found  = new List <MemberInfo>();
            List <object>     values = new List <object>();

            foreach (SerializationEntry entry in info)
            {
                if (!map.TryGetValue(entry.Name, out MemberInfo mi))
                {
                    continue;
                }

                found.Add(mi);
                values.Add(info.GetValue(entry.Name, GetMemberType(mi)));
            }

            obj = FormatterServices.PopulateObjectMembers(obj, found.ToArray(), values.ToArray());

            InvokeOnSerialize(obj, context, false, true);
            return(SerializationStatus.Deserialized(obj));
        }
示例#27
0
        private void InitMemberInfo()
        {
            if (!_serObjectInfoInit._seenBeforeTable.TryGetValue(_objectType, out _cache))
            {
                _cache = new SerObjectInfoCache(_objectType);

                _cache._memberInfos = FormatterServices.GetSerializableMembers(_objectType, _context);
                int count = _cache._memberInfos.Length;
                _cache._memberNames = new string[count];
                _cache._memberTypes = new Type[count];

                // Calculate new arrays
                for (int i = 0; i < count; i++)
                {
                    _cache._memberNames[i] = _cache._memberInfos[i].Name;
                    _cache._memberTypes[i] = ((FieldInfo)_cache._memberInfos[i]).FieldType;
                }
                _serObjectInfoInit._seenBeforeTable.Add(_objectType, _cache);
            }

            if (_obj != null)
            {
                _memberData = FormatterServices.GetObjectData(_obj, _cache._memberInfos);
            }

            _isNamed = true;
        }
示例#28
0
        // X:\jsc.svn\core\ScriptCoreLib\JavaScript\BCLImplementation\System\Runtime\Serialization\FormatterServices.cs

        /// <summary>
        /// This is a javascript application.
        /// </summary>
        /// <param name="page">HTML document rendered by the web server which can now be enhanced.</param>
        public Application(IApp page)
        {
            var o = new xFoo();

            Console.WriteLine(new { o });

            //var x = typeof(o);
            var x = o.GetType();

            Console.WriteLine("GetUninitializedObject");

            // sometime later
            var oo = FormatterServices.GetUninitializedObject(x);

            //var isFoo = oo as xFoo;
            var isFoo = oo is xFoo;

            // Uncaught TypeError: Cannot read property 'LgEABvEJMzKFrGX3QxjvzA' of null

            var om = FormatterServices.GetSerializableMembers(x);
            var ov = FormatterServices.GetObjectData(o, om);

            FormatterServices.PopulateObjectMembers(oo, om, ov);

            // 0:34ms {{ isFoo = true, oo = xFoo: {{ xField1 = field1 {{ Counter = 1 }} }} }}
            // 0:80ms {{ isFoo = true, oo = xFoo: {{ xField1 = null }} }}
            // do we still see ToString?
            Console.WriteLine(new { isFoo, oo });
        }
示例#29
0
    public void Serialize(Stream serializationStream, object graph)
    {
        if (!(graph is IEnumerable))
        {
            throw new Exception("This serialize will only work on IEnumerable.");
        }
        var headings    = typeof(T).GetProperties();
        var headerNames = headings.Select(e => e.Name.ToString()).ToArray();
        var headers     = String.Join(new String(_delimiter, 1), headerNames);

        using (var stream = new StreamWriter(serializationStream))
        {
            if (_firstLineIsHeaders)
            {
                stream.WriteLine(headers);
                stream.Flush();
            }
            var members = FormatterServices.GetSerializableMembers(typeof(T), Context);
            foreach (var item in (IEnumerable)graph)
            {
                var objs      = FormatterServices.GetObjectData(item, members);
                var valueList = objs.Select(e => e.ToString()).ToArray();
                var values    = String.Join(new String(_delimiter, 1), valueList);
                stream.WriteLine(values);
            }
            stream.Flush();
        }
    }
示例#30
0
        public void TestClass1()
        {
            DerivedClass1 derived = new DerivedClass1();

            derived.anotherInt = 69;
            MemberInfo [] members = FormatterServices.GetSerializableMembers(derived.GetType());
            Assert.IsTrue(members != null, "#01");
            Assert.AreEqual(3, members.Length, "#02");

            object [] data = FormatterServices.GetObjectData(derived, members);
            Assert.IsTrue(data != null, "#03");
            Assert.AreEqual(3, data.Length, "#04");

            DerivedClass1 o = (DerivedClass1)FormatterServices.GetUninitializedObject(derived.GetType());

            Assert.IsTrue(o != null, "#05");

            o = (DerivedClass1)FormatterServices.PopulateObjectMembers(o, members, data);
            Assert.IsTrue(o != null, "#06");
            Assert.AreEqual("hola", o.Hello, "#07");
            Assert.AreEqual(21, o.IntBase, "#08");
            Assert.AreEqual(1, o.IntDerived, "#09");
            Assert.AreEqual(69, o.anotherInt, "#10");
            Assert.AreEqual("hey", DerivedClass1.hey, "#11");
        }