#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
}
}