#region Copyright 2011-2014 by Roger Knapp, Licensed under the Apache License, Version 2.0 /* Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #endregion using System; using System.IO; namespace CSharpTest.Net.Serialization { /// /// Provides simple implementations of ISerializer<T> for the primitive .Net types. /// public class PrimitiveSerializer : ISerializer, ISerializer, ISerializer, ISerializer, ISerializer, ISerializer, ISerializer, ISerializer, ISerializer, ISerializer, ISerializer, ISerializer, ISerializer, ISerializer, ISerializer, ISerializer, ISerializer, ISerializer, ISerializer { #region Static singleton accessors /// Gets a singleton of the PrimitiveSerializer public static readonly PrimitiveSerializer Instance = new PrimitiveSerializer(); /// Gets a typed version of the PrimitiveSerializer public static readonly ISerializer String = LimitedSerializer.Unlimited; /// Gets a typed version of the PrimitiveSerializer public static readonly ISerializer Boolean = Instance; /// Gets a typed version of the PrimitiveSerializer public static readonly ISerializer Byte = Instance; /// Gets a typed version of the PrimitiveSerializer public static readonly ISerializer SByte = Instance; /// Gets a typed version of the PrimitiveSerializer public static readonly ISerializer Bytes = LimitedSerializer.Unlimited; /// Gets a typed version of the PrimitiveSerializer public static readonly ISerializer Char = Instance; /// Gets a typed version of the PrimitiveSerializer public static readonly ISerializer DateTime = Instance; /// Gets a typed version of the PrimitiveSerializer public static readonly ISerializer TimeSpan = Instance; /// Gets a typed version of the PrimitiveSerializer public static readonly ISerializer Int16 = Instance; /// Gets a typed version of the PrimitiveSerializer public static readonly ISerializer UInt16 = Instance; /// Gets a typed version of the PrimitiveSerializer public static readonly ISerializer Int32 = Instance; /// Gets a typed version of the PrimitiveSerializer public static readonly ISerializer UInt32 = Instance; /// Gets a typed version of the PrimitiveSerializer public static readonly ISerializer Int64 = Instance; /// Gets a typed version of the PrimitiveSerializer public static readonly ISerializer UInt64 = Instance; /// Gets a typed version of the PrimitiveSerializer public static readonly ISerializer Double = Instance; /// Gets a typed version of the PrimitiveSerializer public static readonly ISerializer Float = Instance; /// Gets a typed version of the PrimitiveSerializer public static readonly ISerializer Guid = Instance; /// Gets a typed version of the PrimitiveSerializer public static readonly ISerializer IntPtr = Instance; /// Gets a typed version of the PrimitiveSerializer public static readonly ISerializer UIntPtr = Instance; #endregion #region ISerializer Members void ISerializer.WriteTo(string value, Stream stream) { String.WriteTo(value, stream); } string ISerializer.ReadFrom(Stream stream) { return String.ReadFrom(stream); } #endregion #region ISerializer Members void ISerializer.WriteTo(bool value, Stream stream) { const byte bTrue = 1; const byte bFalse = 0; stream.WriteByte(value ? bTrue : bFalse); } bool ISerializer.ReadFrom(Stream stream) { int result = stream.ReadByte(); Check.Assert(result != -1); return result == 1; } #endregion #region ISerializer Members void ISerializer.WriteTo(byte value, Stream stream) { stream.WriteByte(value); } byte ISerializer.ReadFrom(Stream stream) { int result = stream.ReadByte(); Check.Assert(result != -1); return unchecked((byte)result); } #endregion #region ISerializer Members void ISerializer.WriteTo(sbyte value, Stream stream) { stream.WriteByte(unchecked((byte)value)); } sbyte ISerializer.ReadFrom(Stream stream) { int result = stream.ReadByte(); Check.Assert(result != -1); return unchecked((sbyte)result); } #endregion #region ISerializer Members void ISerializer.WriteTo(byte[] value, Stream stream) { Bytes.WriteTo(value, stream); } byte[] ISerializer.ReadFrom(Stream stream) { return Bytes.ReadFrom(stream); } #endregion #region ISerializer Members void ISerializer.WriteTo(char value, Stream stream) { VariantNumberSerializer.Int32.WriteTo(value, stream); } char ISerializer.ReadFrom(Stream stream) { return unchecked((char)VariantNumberSerializer.Int32.ReadFrom(stream)); } #endregion #region ISerializer Members void ISerializer.WriteTo(DateTime value, Stream stream) { ((ISerializer)this).WriteTo(value.ToBinary(), stream); } DateTime ISerializer.ReadFrom(Stream stream) { return System.DateTime.FromBinary(((ISerializer)this).ReadFrom(stream)); } #endregion #region ISerializer Members void ISerializer.WriteTo(TimeSpan value, Stream stream) { ((ISerializer)this).WriteTo(value.Ticks, stream); } TimeSpan ISerializer.ReadFrom(Stream stream) { return new TimeSpan(((ISerializer)this).ReadFrom(stream)); } #endregion #region ISerializer Members void ISerializer.WriteTo(short value, Stream stream) { ((ISerializer)this).WriteTo(unchecked((ushort)value), stream); } short ISerializer.ReadFrom(Stream stream) { return unchecked((short)((ISerializer)this).ReadFrom(stream)); } #endregion #region ISerializer Members void ISerializer.WriteTo(ushort value, Stream stream) { unchecked { stream.WriteByte((byte)(value >> 8)); stream.WriteByte((byte)value); } } ushort ISerializer.ReadFrom(Stream stream) { unchecked { int b1 = stream.ReadByte(); int b2 = stream.ReadByte(); Check.Assert(b2 != -1); return (ushort)((b1 << 8) | b2); } } #endregion #region ISerializer Members void ISerializer.WriteTo(int value, Stream stream) { ((ISerializer)this).WriteTo(unchecked((uint)value), stream); } int ISerializer.ReadFrom(Stream stream) { return unchecked((int)((ISerializer)this).ReadFrom(stream)); } #endregion #region ISerializer Members void ISerializer.WriteTo(uint value, Stream stream) { unchecked { stream.WriteByte((byte)(value >> 24)); stream.WriteByte((byte)(value >> 16)); stream.WriteByte((byte)(value >> 8)); stream.WriteByte((byte)value); } } uint ISerializer.ReadFrom(Stream stream) { unchecked { int b1 = stream.ReadByte(); int b2 = stream.ReadByte(); int b3 = stream.ReadByte(); int b4 = stream.ReadByte(); Check.Assert(b4 != -1); return ( (((uint)b1) << 24) | (((uint)b2) << 16) | (((uint)b3) << 8) | (((uint)b4) << 0) ); } } #endregion #region ISerializer Members void ISerializer.WriteTo(long value, Stream stream) { ((ISerializer)this).WriteTo(unchecked((ulong)value), stream); } long ISerializer.ReadFrom(Stream stream) { return unchecked((long)((ISerializer)this).ReadFrom(stream)); } #endregion #region ISerializer Members void ISerializer.WriteTo(ulong value, Stream stream) { unchecked { stream.WriteByte((byte)(value >> 56)); stream.WriteByte((byte)(value >> 48)); stream.WriteByte((byte)(value >> 40)); stream.WriteByte((byte)(value >> 32)); stream.WriteByte((byte)(value >> 24)); stream.WriteByte((byte)(value >> 16)); stream.WriteByte((byte)(value >> 8)); stream.WriteByte((byte)value); } } ulong ISerializer.ReadFrom(Stream stream) { unchecked { int b1 = stream.ReadByte(); int b2 = stream.ReadByte(); int b3 = stream.ReadByte(); int b4 = stream.ReadByte(); int b5 = stream.ReadByte(); int b6 = stream.ReadByte(); int b7 = stream.ReadByte(); int b8 = stream.ReadByte(); Check.Assert(b8 != -1); return ( (((ulong)b1) << 56) | (((ulong)b2) << 48) | (((ulong)b3) << 40) | (((ulong)b4) << 32) | (((ulong)b5) << 24) | (((ulong)b6) << 16) | (((ulong)b7) << 8) | (((ulong)b8) << 0) ); } } #endregion #region ISerializer Members void ISerializer.WriteTo(double value, Stream stream) { ((ISerializer)this).WriteTo(BitConverter.DoubleToInt64Bits(value), stream); } double ISerializer.ReadFrom(Stream stream) { return BitConverter.Int64BitsToDouble(((ISerializer)this).ReadFrom(stream)); } #endregion #region ISerializer Members void ISerializer.WriteTo(float value, Stream stream) { ((ISerializer)this).WriteTo(BitConverter.DoubleToInt64Bits(value), stream); } float ISerializer.ReadFrom(Stream stream) { return unchecked((float)BitConverter.Int64BitsToDouble(((ISerializer)this).ReadFrom(stream))); } #endregion #region ISerializer Members void ISerializer.WriteTo(Guid value, Stream stream) { stream.Write(value.ToByteArray(), 0, 16); } Guid ISerializer.ReadFrom(Stream stream) { byte[] tmp = new byte[16]; int len, bytesRead = 0; while (bytesRead < 16 && 0 != (len = stream.Read(tmp, bytesRead, 16 - bytesRead))) bytesRead += len; Check.Assert(16 == bytesRead); return new Guid(tmp); } #endregion #region ISerializer Members void ISerializer.WriteTo(IntPtr value, Stream stream) { ((ISerializer)this).WriteTo(value.ToInt64(), stream); } IntPtr ISerializer.ReadFrom(Stream stream) { return new IntPtr(((ISerializer)this).ReadFrom(stream)); } #endregion #region ISerializer Members void ISerializer.WriteTo(UIntPtr value, Stream stream) { ((ISerializer)this).WriteTo(value.ToUInt64(), stream); } UIntPtr ISerializer.ReadFrom(Stream stream) { return new UIntPtr(((ISerializer)this).ReadFrom(stream)); } #endregion } }