File: System\Runtime\Serialization\Formatter.cs
Web Access
Project: src\src\libraries\System.Runtime.Serialization.Formatters\src\System.Runtime.Serialization.Formatters.csproj (System.Runtime.Serialization.Formatters)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Collections;
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.IO;
 
namespace System.Runtime.Serialization
{
    [CLSCompliant(false)]
    [Obsolete(Obsoletions.BinaryFormatterMessage, DiagnosticId = Obsoletions.BinaryFormatterDiagId, UrlFormat = Obsoletions.SharedUrlFormat)]
    public abstract class Formatter : IFormatter
    {
        protected ObjectIDGenerator m_idGenerator;
        protected Queue m_objectQueue;
 
        protected Formatter()
        {
            m_objectQueue = new Queue();
            m_idGenerator = new ObjectIDGenerator();
        }
 
        [RequiresDynamicCode(IFormatter.RequiresDynamicCodeMessage)]
        [RequiresUnreferencedCode(IFormatter.RequiresUnreferencedCodeMessage)]
        public abstract object Deserialize(Stream serializationStream);
 
        protected virtual object? GetNext(out long objID)
        {
            if (m_objectQueue.Count == 0)
            {
                objID = 0;
                return null;
            }
 
            object obj = m_objectQueue.Dequeue()!;
 
            bool isNew;
            objID = m_idGenerator.HasId(obj, out isNew);
            if (isNew)
            {
                throw new SerializationException(SR.Serialization_NoID);
            }
 
            return obj;
        }
 
        protected virtual long Schedule(object? obj)
        {
            if (obj == null)
            {
                return 0;
            }
 
            bool isNew;
            long id = m_idGenerator.GetId(obj, out isNew);
 
            if (isNew)
            {
                m_objectQueue.Enqueue(obj);
            }
            return id;
        }
 
        [RequiresUnreferencedCode(IFormatter.RequiresUnreferencedCodeMessage)]
        public abstract void Serialize(Stream serializationStream, object graph);
 
        protected abstract void WriteArray(object obj, string name, Type memberType);
 
        protected abstract void WriteBoolean(bool val, string name);
 
        protected abstract void WriteByte(byte val, string name);
 
        protected abstract void WriteChar(char val, string name);
 
        protected abstract void WriteDateTime(DateTime val, string name);
 
        protected abstract void WriteDecimal(decimal val, string name);
 
        protected abstract void WriteDouble(double val, string name);
 
        protected abstract void WriteInt16(short val, string name);
 
        protected abstract void WriteInt32(int val, string name);
 
        protected abstract void WriteInt64(long val, string name);
 
        protected abstract void WriteObjectRef(object? obj, string name, Type memberType);
 
        protected virtual void WriteMember(string memberName, object? data)
        {
            if (data == null)
            {
                WriteObjectRef(data, memberName, typeof(object));
                return;
            }
 
            Type varType = data.GetType();
 
            if (varType == typeof(bool))
            {
                WriteBoolean(Convert.ToBoolean(data, CultureInfo.InvariantCulture), memberName);
            }
            else if (varType == typeof(char))
            {
                WriteChar(Convert.ToChar(data, CultureInfo.InvariantCulture), memberName);
            }
            else if (varType == typeof(sbyte))
            {
                WriteSByte(Convert.ToSByte(data, CultureInfo.InvariantCulture), memberName);
            }
            else if (varType == typeof(byte))
            {
                WriteByte(Convert.ToByte(data, CultureInfo.InvariantCulture), memberName);
            }
            else if (varType == typeof(short))
            {
                WriteInt16(Convert.ToInt16(data, CultureInfo.InvariantCulture), memberName);
            }
            else if (varType == typeof(int))
            {
                WriteInt32(Convert.ToInt32(data, CultureInfo.InvariantCulture), memberName);
            }
            else if (varType == typeof(long))
            {
                WriteInt64(Convert.ToInt64(data, CultureInfo.InvariantCulture), memberName);
            }
            else if (varType == typeof(float))
            {
                WriteSingle(Convert.ToSingle(data, CultureInfo.InvariantCulture), memberName);
            }
            else if (varType == typeof(double))
            {
                WriteDouble(Convert.ToDouble(data, CultureInfo.InvariantCulture), memberName);
            }
            else if (varType == typeof(DateTime))
            {
                WriteDateTime(Convert.ToDateTime(data, CultureInfo.InvariantCulture), memberName);
            }
            else if (varType == typeof(decimal))
            {
                WriteDecimal(Convert.ToDecimal(data, CultureInfo.InvariantCulture), memberName);
            }
            else if (varType == typeof(ushort))
            {
                WriteUInt16(Convert.ToUInt16(data, CultureInfo.InvariantCulture), memberName);
            }
            else if (varType == typeof(uint))
            {
                WriteUInt32(Convert.ToUInt32(data, CultureInfo.InvariantCulture), memberName);
            }
            else if (varType == typeof(ulong))
            {
                WriteUInt64(Convert.ToUInt64(data, CultureInfo.InvariantCulture), memberName);
            }
            else if (varType.IsArray)
            {
                WriteArray(data, memberName, varType);
            }
            else if (varType.IsValueType)
            {
                WriteValueType(data, memberName, varType);
            }
            else
            {
                WriteObjectRef(data, memberName, varType);
            }
        }
 
        [CLSCompliant(false)]
        protected abstract void WriteSByte(sbyte val, string name);
 
        protected abstract void WriteSingle(float val, string name);
 
        protected abstract void WriteTimeSpan(TimeSpan val, string name);
 
        [CLSCompliant(false)]
        protected abstract void WriteUInt16(ushort val, string name);
 
        [CLSCompliant(false)]
        protected abstract void WriteUInt32(uint val, string name);
 
        [CLSCompliant(false)]
        protected abstract void WriteUInt64(ulong val, string name);
 
        protected abstract void WriteValueType(object obj, string name, Type memberType);
 
        public abstract ISurrogateSelector? SurrogateSelector { get; set; }
 
        public abstract SerializationBinder? Binder { get; set; }
 
        public abstract StreamingContext Context { get; set; }
    }
}