/// <summary> /// Constructor. /// </summary> /// <param name="type">Type.</param> /// <param name="typeId">Type ID.</param> /// <param name="typeName">Type name.</param> /// <param name="userType">User type flag.</param> /// <param name="nameConverter">Name converter.</param> /// <param name="mapper">Mapper.</param> /// <param name="serializer">Serializer.</param> /// <param name="metaEnabled">Metadata enabled flag.</param> /// <param name="keepDeserialized">Whether to cache deserialized value in IPortableObject</param> /// <param name="affKeyFieldName">Affinity field key name.</param> /// <param name="typedHandler">Typed handler.</param> /// <param name="untypedHandler">Untyped handler.</param> public PortableFullTypeDescriptor( Type type, int typeId, string typeName, bool userType, IPortableNameMapper nameConverter, IPortableIdMapper mapper, IPortableSerializer serializer, bool metaEnabled, bool keepDeserialized, string affKeyFieldName, object typedHandler, PortableSystemWriteDelegate untypedHandler) { _type = type; _typeId = typeId; _typeName = typeName; _userType = userType; _nameConverter = nameConverter; _mapper = mapper; _serializer = serializer; _metaEnabled = metaEnabled; _keepDeserialized = keepDeserialized; _affKeyFieldName = affKeyFieldName; _typedHandler = typedHandler; _untypedHandler = untypedHandler; }
/// <summary> /// Add user type. /// </summary> /// <param name="cfg">Configuration.</param> /// <param name="typeCfg">Type configuration.</param> /// <param name="typeResolver">The type resolver.</param> /// <param name="dfltSerializer">The default serializer.</param> private void AddUserType(PortableConfiguration cfg, PortableTypeConfiguration typeCfg, TypeResolver typeResolver, IPortableSerializer dfltSerializer) { // Get converter/mapper/serializer. IPortableNameMapper nameMapper = typeCfg.NameMapper ?? cfg.DefaultNameMapper; IPortableIdMapper idMapper = typeCfg.IdMapper ?? cfg.DefaultIdMapper; bool metaEnabled = typeCfg.MetadataEnabled ?? cfg.DefaultMetadataEnabled; bool keepDeserialized = typeCfg.KeepDeserialized ?? cfg.DefaultKeepDeserialized; // Try resolving type. Type type = typeResolver.ResolveType(typeCfg.TypeName, typeCfg.AssemblyName); if (type != null) { // Type is found. var typeName = GetTypeName(type); int typeId = PortableUtils.TypeId(typeName, nameMapper, idMapper); var serializer = typeCfg.Serializer ?? cfg.DefaultSerializer ?? GetPortableMarshalAwareSerializer(type) ?? dfltSerializer; var refSerializer = serializer as PortableReflectiveSerializer; if (refSerializer != null) { refSerializer.Register(type, typeId, nameMapper, idMapper); } AddType(type, typeId, typeName, true, metaEnabled, keepDeserialized, nameMapper, idMapper, serializer, typeCfg.AffinityKeyFieldName, null, null); } else { // Type is not found. string typeName = PortableUtils.SimpleTypeName(typeCfg.TypeName); int typeId = PortableUtils.TypeId(typeName, nameMapper, idMapper); AddType(null, typeId, typeName, true, metaEnabled, keepDeserialized, nameMapper, idMapper, null, typeCfg.AffinityKeyFieldName, null, null); } }
/// <summary> /// Add type. /// </summary> /// <param name="type">Type.</param> /// <param name="typeId">Type ID.</param> /// <param name="typeName">Type name.</param> /// <param name="userType">User type flag.</param> /// <param name="metaEnabled">Metadata enabled flag.</param> /// <param name="keepDeserialized">Whether to cache deserialized value in IPortableObject</param> /// <param name="nameMapper">Name mapper.</param> /// <param name="idMapper">ID mapper.</param> /// <param name="serializer">Serializer.</param> /// <param name="affKeyFieldName">Affinity key field name.</param> /// <param name="typedHandler">Typed handler.</param> /// <param name="untypedHandler">Untyped handler.</param> private void AddType(Type type, int typeId, string typeName, bool userType, bool metaEnabled, bool keepDeserialized, IPortableNameMapper nameMapper, IPortableIdMapper idMapper, IPortableSerializer serializer, string affKeyFieldName, object typedHandler, PortableSystemWriteDelegate untypedHandler) { long typeKey = PortableUtils.TypeKey(userType, typeId); if (_idToDesc.ContainsKey(typeKey)) { string type1 = _idToDesc[typeKey].Type != null ? _idToDesc[typeKey].Type.AssemblyQualifiedName : null; string type2 = type != null ? type.AssemblyQualifiedName : null; throw new PortableException("Conflicting type IDs [type1=" + type1 + ", type2=" + type2 + ", typeId=" + typeId + ']'); } if (userType && _typeNameToDesc.ContainsKey(typeName)) { throw new PortableException("Conflicting type name: " + typeName); } IPortableTypeDescriptor descriptor = new PortableFullTypeDescriptor(type, typeId, typeName, userType, nameMapper, idMapper, serializer, metaEnabled, keepDeserialized, affKeyFieldName, typedHandler, untypedHandler); if (type != null) { _typeToDesc[type] = descriptor; } if (userType) { _typeNameToDesc[typeName] = descriptor; } _idToDesc[typeKey] = descriptor; }