/// <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); } } }
/// <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);