/// <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;
 }
Exemple #2
0
        /// <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);
            }
        }
Exemple #3
0
        /// <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;
        }