| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185 |
- //
- // System.Runtime.Serialization.Formatter.cs
- //
- // Authors:
- // Duncan Mak ([email protected])
- // Andreas Nahr ([email protected])
- //
- // (C) Ximian, Inc.
- //
- //
- // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
- //
- // Permission is hereby granted, free of charge, to any person obtaining
- // a copy of this software and associated documentation files (the
- // "Software"), to deal in the Software without restriction, including
- // without limitation the rights to use, copy, modify, merge, publish,
- // distribute, sublicense, and/or sell copies of the Software, and to
- // permit persons to whom the Software is furnished to do so, subject to
- // the following conditions:
- //
- // The above copyright notice and this permission notice shall be
- // included in all copies or substantial portions of the Software.
- //
- // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
- // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
- // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- //
- using System;
- using System.Collections;
- using System.IO;
- namespace System.Runtime.Serialization
- {
- [CLSCompliant (false)]
- [Serializable]
- public abstract class Formatter : IFormatter
- {
- protected Formatter ()
- {
- }
-
- protected ObjectIDGenerator m_idGenerator = new ObjectIDGenerator ();
- protected Queue m_objectQueue = new Queue ();
- public abstract SerializationBinder Binder {
- get;
- set;
- }
- public abstract StreamingContext Context {
- get;
- set;
- }
- public abstract ISurrogateSelector SurrogateSelector {
- get;
- set;
- }
- public abstract object Deserialize (Stream serializationStream);
- protected virtual object GetNext (out long objID)
- {
- if (m_objectQueue.Count == 0)
- {
- // set the out field to 0
- objID = 0L;
- return null;
- }
- Object o = m_objectQueue.Dequeue ();
- bool FirstTime;
- objID = m_idGenerator.HasId (o, out FirstTime);
- return o;
- }
- protected virtual long Schedule (object obj)
- {
- if (obj == null)
- return 0L;
- bool FirstTime;
- long ID = m_idGenerator.GetId (obj, out FirstTime);
- if (FirstTime)
- m_objectQueue.Enqueue (obj);
- return ID;
- }
- 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 virtual void WriteMember (string memberName, object data)
- {
- if (data == null)
- WriteObjectRef (data, memberName, typeof(Object));
- Type dataType = data.GetType ();
- if (dataType.IsArray)
- WriteArray (data, memberName, dataType);
- else if (dataType == typeof(bool))
- WriteBoolean ((bool)data, memberName);
- else if (dataType == typeof(byte))
- WriteByte ((byte)data, memberName);
- else if (dataType == typeof(char))
- WriteChar ((char)data, memberName);
- else if (dataType == typeof(DateTime))
- WriteDateTime ((DateTime)data, memberName);
- else if (dataType == typeof(decimal))
- WriteDecimal ((decimal)data, memberName);
- else if (dataType == typeof(double))
- WriteDouble ((double)data, memberName);
- else if (dataType == typeof(Int16))
- WriteInt16 ((Int16)data, memberName);
- else if (dataType == typeof(Int32))
- WriteInt32 ((Int32)data, memberName);
- else if (dataType == typeof(Int64))
- WriteInt64 ((Int64)data, memberName);
- else if (dataType == typeof(sbyte))
- WriteSByte ((sbyte)data, memberName);
- else if (dataType == typeof(float))
- WriteSingle ((float)data, memberName);
- else if (dataType == typeof(TimeSpan))
- WriteTimeSpan ((TimeSpan)data, memberName);
- else if (dataType == typeof(UInt16))
- WriteUInt16 ((UInt16)data, memberName);
- else if (dataType == typeof(UInt32))
- WriteUInt32 ((UInt32)data, memberName);
- else if (dataType == typeof(UInt64))
- WriteUInt64 ((UInt64)data, memberName);
- else if (dataType.IsValueType)
- WriteValueType (data, memberName, dataType);
- WriteObjectRef (data, memberName, dataType);
- }
- protected abstract void WriteObjectRef (object obj, string name, Type memberType);
- [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);
- }
- }
|