예제 #1
0
        /// <summary>
        /// 动态绑定实体对象的子类类型
        /// </summary>
        /// <param name="assembly"></param>
        public static void LoadProtobufType(Assembly assembly)
        {
            if (assembly == null)
            {
                throw new ArgumentNullException("assembly");
            }
            var types = assembly.GetTypes().Where(p => p.GetCustomAttributes(typeof(ProtoContractAttribute), false).Count() > 0).ToList();

            for (int i = 0; i < types.Count; i++)
            {
                var myEntity = types[i];

                //获得所有属性
                var Properties = myEntity.GetProperties(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase).Where(p => p.GetCustomAttributes(typeof(ProtoMemberAttribute), true).Count() > 0).ToList();
                var Fields     = myEntity.GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase).Where(p => p.GetCustomAttributes(typeof(ProtoMemberAttribute), true).Count() > 0).ToList();
                try
                {
                    if (typeModel.CanSerializeContractType(myEntity))
                    {
                        var metaType = typeModel.Add(myEntity, true);
                        LoadProtoTypeMember(myEntity, Properties, metaType, Fields);
                    }
                }
                //忽略异常
                catch (Exception e)
                {
                    TraceLog.WriteError("Loading protobuf type \"{0}\" error:{1}", myEntity.FullName, e);
                }
            }
        }
예제 #2
0
        /// <summary>
        /// 动态绑定实体对象的子类类型
        /// </summary>
        /// <param name="assembly"></param>
        public static void LoadProtobufType(Assembly assembly)
        {
            if (assembly == null)
            {
                throw new ArgumentNullException("assembly");
            }
            Dictionary <Type, int> typeMemberTags = new Dictionary <Type, int>();
            var types = assembly.GetTypes().Where(p => p.GetCustomAttributes(typeof(ProtoContractAttribute), false).Count() > 0).ToList();

            for (int i = 0; i < types.Count; i++)
            {
                var myEntity = types[i];

                //获得所有属性
                var Properties = myEntity.GetProperties(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase).Where(p => p.GetCustomAttributes(typeof(ProtoMemberAttribute), true).Count() > 0).ToList();
                var Fields     = myEntity.GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase).Where(p => p.GetCustomAttributes(typeof(ProtoMemberAttribute), true).Count() > 0).ToList();
                try
                {
                    if (typeModel.CanSerializeContractType(myEntity))
                    {
                        var metaType = typeModel.Add(myEntity, true);
                        int maxMemberTag;
                        LoadProtoTypeMember(myEntity, Properties, metaType, Fields, out maxMemberTag);
                        typeMemberTags[myEntity] = maxMemberTag;

                        //增加继承的子类
                        if (myEntity.BaseType != null)
                        {
                            var parentMetaType = typeModel[myEntity.BaseType];
                            if (parentMetaType != null && typeMemberTags.ContainsKey(myEntity.BaseType))
                            {
                                var parentMemberTag = typeMemberTags[myEntity.BaseType] + 1;
                                parentMetaType.AddSubType(parentMemberTag, myEntity);
                                typeMemberTags[myEntity.BaseType] = parentMemberTag;
                            }
                        }
                    }
                }
                //忽略异常
                catch (Exception e)
                {
                    TraceLog.WriteError("Loading protobuf type \"{0}\" error:{1}", myEntity.FullName, e);
                }
            }
        }
 /// <summary>
 /// Indicates whether a type should be considered as a serializable data type
 /// </summary>
 protected override bool CanSerialize(Type type)
 => _model.CanSerializeContractType(type);
 /// <summary>
 /// Indicates whether a type should be considered as a serializable data type
 /// </summary>
 protected internal override bool CanSerialize(Type type)
 => Has(Options.ContractTypesOnly)
         ? _model.CanSerializeContractType(type)
         : _model.CanSerialize(type);