import { Discriminant } from './discriminant';
import { Discriminator } from './discriminator';
import { Factory } from './factory';
import { GenericMetadata } from './generic-metadata';
import { Injector } from './injector';
import { Logger } from './logger';
import { Nullable } from './nullable';
import { Optional } from './optional';
import { PropertyState } from './property-state';
import { ReferenceCallback } from './reference-callback';
import { ReferenceHandler } from './reference-handler';
import { ReferenceKey } from './reference-key';
import { ReferenceValue } from './reference-value';
import { ReferenceValueGetter } from './reference-value-getter';
import { ReferenceValueSetter } from './reference-value-setter';
import { Serializer } from './serializer';
import { TypeFn } from './type-fn';
import { TypeLike } from './type-like';
import { TypeMetadata } from './type-metadata';
import { TypeState } from './type-state';
/**
 * Serializer context of a certain type.
 *
 * @type {SerializerContext<TObject>}
 */
export declare class SerializerContext<TObject> {
    /**
     * Serializer context root.
     *
     * This is a value passed to the root serializer.
     *
     * @type {any}
     */
    readonly $: any;
    /**
     * Reference map.
     *
     * Used to preserve object references.
     *
     * @type {Map<ReferenceKey, ReferenceValue>}
     */
    readonly referenceMap: Map<ReferenceKey, ReferenceValue>;
    /**
     * Reference callback map.
     *
     * Used to assign object references in a later time due to circular dependency.
     *
     * @type {Map<ReferenceKey, Array<ReferenceCallback>>}
     */
    readonly referenceCallbackMap: Map<ReferenceKey, Array<ReferenceCallback>>;
    /**
     * Parent serializer context.
     *
     * Present when any serializer defines child context.
     *
     * @type {Optional<SerializerContext<any>>}
     */
    readonly parentSerializerContext: Optional<SerializerContext<any>>;
    /**
     * Json path key.
     *
     * @type {any}
     */
    jsonPathKey: any;
    /**
     * Type state.
     *
     * @type {TypeState<TObject>}
     */
    typeState: TypeState<TObject>;
    /**
     * Property state.
     *
     * @type {TypeState<TObject>}
     */
    genericMetadatas: ReadonlyArray<GenericMetadata<any>>;
    /**
     * Property state.
     *
     * @type {Optional<PropertyState<any, TObject>>}
     */
    propertyState: Optional<PropertyState<any, TObject>>;
    /**
     * Reference value setter.
     *
     * @type {Optional<ReferenceValueSetter>}
     */
    referenceValueSetter: Optional<ReferenceValueSetter>;
    /**
     * Constructor.
     *
     * @param {any} $ Serializer context root.
     * @param {Map<ReferenceKey, ReferenceValue>} referenceMap Reference map.
     * @param {Map<ReferenceKey, Array<ReferenceCallback>>} referenceCallbackMap Reference callback map.
     * @param {Optional<SerializerContext<any>>} parentSerializerContext Parent serializer context.
     * @param {any} jsonPathKey Json path key.
     * @param {TypeState<TObject>} typeState Type state.
     * @param {ReadonlyArray<GenericMetadata<any>>} genericMetadatas Generic metadatas.
     * @param {Optional<PropertyState<any, TObject>>} propertyState Property state.
     * @param {Optional<ReferenceValueSetter>} referenceValueSetter Reference value setter.
     */
    constructor($: any, referenceMap: Map<ReferenceKey, ReferenceValue>, referenceCallbackMap: Map<ReferenceKey, Array<ReferenceCallback>>, parentSerializerContext: Optional<SerializerContext<any>>, jsonPathKey: any, typeState: TypeState<TObject>, genericMetadatas: ReadonlyArray<GenericMetadata<any>>, propertyState: Optional<PropertyState<any, TObject>>, referenceValueSetter: Optional<ReferenceValueSetter>);
    /**
     * Gets json path from serializer context root.
     *
     * @returns {string} Json path.
     */
    get jsonPath(): string;
    /**
     * Gets serialized null value.
     *
     * @returns {Nullable<any>} Resolved serialized null value or undefined.
     */
    get serializedNullValue(): Nullable<any>;
    /**
     * Gets serialized default value.
     *
     * @returns {Optional<any>} Resolved serialized default value or undefined.
     */
    get serializedDefaultValue(): Optional<any>;
    /**
     * Gets deserialized null value.
     *
     * @returns {Nullable<any>} Resolved deserialized null value or undefined.
     */
    get deserializedNullValue(): Nullable<any>;
    /**
     * Gets deserialized default value.
     *
     * @returns {Optional<any>} Resolved deserialized default value or undefined.
     */
    get deserializedDefaultValue(): Optional<any>;
    /**
     * Gets discriminant.
     *
     * @returns {Discriminant} Discriminant.
     */
    get discriminant(): Discriminant;
    /**
     * Gets discriminator.
     *
     * @returns {Discriminator} Discriminator.
     */
    get discriminator(): Discriminator;
    /**
     * Gets factory.
     *
     * @returns {Factory} Factory.
     */
    get factory(): Factory;
    /**
     * Gets injector.
     *
     * @returns {Injector} Injector
     */
    get injector(): Injector;
    /**
     * Gets logger.
     *
     * @returns {Logger} Logger instance.
     */
    get logger(): Logger;
    /**
     * Gets indicator if context is polymorphic.
     *
     * @returns {boolean} True when context is polymorphic. False otherwise.
     */
    get polymorphic(): boolean;
    /**
     * Gets indicator if discriminator should be preserved.
     *
     * @returns {boolean} True when discriminator should be preserved. False otherwise.
     */
    get preserveDiscriminator(): boolean;
    /**
     * Gets reference handler.
     *
     * @returns {ReferenceHandler} Reference handler.
     */
    get referenceHandler(): ReferenceHandler;
    /**
     * Gets serializer.
     *
     * @returns {Serializer<TObject>} Serializer.
     */
    get serializer(): Serializer<TObject>;
    /**
     * Gets type metadata.
     *
     * @returns {TypeMetadata<TObject>} Type metadata.
     */
    get typeMetadata(): TypeMetadata<TObject>;
    /**
     * Gets indicator if null value should be preserved.
     *
     * @returns {boolean} True when null value should be preserved. False otherwise.
     */
    get preserveNull(): boolean;
    /**
     * Gets indicator if default value should be used.
     *
     * @returns {boolean} True when type should use default value. False otherwise.
     */
    get useDefaultValue(): boolean;
    /**
     * Gets indicator if implicit conversion should be used.
     *
     * @returns {boolean} True when type should use implicit conversion. False otherwise.
     */
    get useImplicitConversion(): boolean;
    /**
     * Serializes provided value using context.
     *
     * @param {TypeLike<TObject>} x Some value.
     *
     * @returns {TypeLike<any>} Value serialized by context.
     */
    serialize(x: TypeLike<TObject>): TypeLike<any>;
    /**
     * Deserializes provided value using context.
     *
     * @param {TypeLike<any>} x Some value.
     *
     * @returns {TypeLike<TObject>} Value deserialized by context.
     */
    deserialize(x: TypeLike<any>): TypeLike<TObject>;
    /**
     * Defines reference.
     *
     * May be called during serialization to define reference.
     *
     * @param {ReferenceKey} referenceKey Reference key.
     * @param {ReferenceValueGetter} referenceValueGetter Reference value getter.
     *
     * @returns {ReferenceValue} Reference value.
     */
    defineReference(referenceKey: ReferenceKey, referenceValueGetter: ReferenceValueGetter): ReferenceValue;
    /**
     * Restores reference.
     *
     * May be called during deserialization to restore reference.
     *
     * @param {ReferenceKey} referenceKey Reference key.
     * @param {ReferenceValueGetter} referenceValueGetter Reference value getter.
     *
     * @returns {ReferenceValue} Reference value.
     */
    restoreReference(referenceKey: ReferenceKey, referenceValueGetter: ReferenceValueGetter): ReferenceValue;
    /**
     * Registers callback for provided reference key.
     *
     * May be called by reference handlers to register a callback resolver for a circular reference.
     *
     * @param {ReferenceKey} referenceKey Reference key.
     *
     * @returns {void}
     */
    registerReferenceCallback(referenceKey: ReferenceKey): void;
    /**
     * Pushes callback for provided reference key.
     *
     * Called by reference handlers during handling of circular references.
     *
     * @param {ReferenceKey} referenceKey Reference key.
     * @param {ReferenceCallback} referenceCallback Reference callback.
     *
     * @returns {void}
     */
    pushReferenceCallback(referenceKey: ReferenceKey, referenceCallback: ReferenceCallback): void;
    /**
     * Resolves callbacks for provided reference key.
     *
     * May be called by reference handlers when circular references can be resolved.
     *
     * @param {ReferenceKey} referenceKey Reference key.
     *
     * @returns {void}
     */
    resolveReferenceCallbacks(referenceKey: ReferenceKey): void;
    /**
     * Defines child serializer context.
     *
     * Called by serializers on drill down.
     *
     * @returns {SerializerContext<any>} Child serializer context.
     */
    defineChildSerializerContext(): SerializerContext<any>;
    /**
     * Defines generic serializer context.
     *
     * Called by serializers which work with generics.
     *
     * @param {number} genericIndex Generic index.
     *
     * @returns {SerializerContext<any>} Generic serializer context.
     */
    defineGenericSerializerContext(genericIndex: number): SerializerContext<any>;
    /**
     * Defines polymorphic serializer context.
     *
     * Called by serializers which work with polymorphic types.
     *
     * @param {TypeFn<any>|Record<string, any>} x Type function or record.
     *
     * @returns {SerializerContext<any>} Polymorphic serializer context.
     */
    definePolymorphicSerializerContext(x: TypeFn<any> | Record<string, any>): SerializerContext<any>;
    /**
     * Defines polymorphic serializer context by type function.
     *
     * @param {TypeFn<any>|Record<string, any>} x Type function or record.
     *
     * @returns {SerializerContext<any>} Polymorphic serializer context.
     */
    private definePolymorphicSerializerContextByTypeFn;
    /**
     * Defines polymorphic serializer context by discriminant.
     *
     * @param {TypeFn<any>|Record<string, any>} x Type function or record.
     *
     * @returns {SerializerContext<any>} Polymorphic serializer context.
     */
    private definePolymorphicSerializerContextByDiscriminant;
}
//# sourceMappingURL=serializer-context.d.ts.map