public object Deserialize(Stream serializationStream) { if (serializationStream.Read(_lengthBuffer, 0, 4) != 4) { throw new SerializationException("Could not read length from the stream."); } var length = new IntToBytes(_lengthBuffer[0], _lengthBuffer[1], _lengthBuffer[2], _lengthBuffer[3]); //TODO make this support partial reads from stream if (serializationStream.Read(_copyBuffer, 0, length.I32) != length.I32) { throw new SerializationException("Could not read " + length + " bytes from the stream."); } _readStream.Seek(0L, SeekOrigin.Begin); _readStream.Write(_copyBuffer, 0, length.I32); _readStream.Seek(0L, SeekOrigin.Begin); var typeid = _reader.ReadInt32(); Type t; if (!_byId.TryGetValue(typeid, out t)) { throw new SerializationException("TypeId " + typeid + " is not a registerred type id"); } var obj = FormatterServices.GetUninitializedObject(t); var deserialize = (ICustomBinarySerializable)obj; deserialize.SetDataFrom(_reader); if (_readStream.Position != length.I32) { throw new SerializationException("object of type " + t + " did not read its entire buffer during deserialization. This is most likely an inbalance between the writes and the reads of the object."); } return(deserialize); }
public void Serialize(Stream serializationStream, object graph) { int key; if (!_byType.TryGetValue(graph.GetType(), out key)) { throw new SerializationException(graph.GetType() + " has not been registered with the serializer"); } var c = (ICustomBinarySerializable)graph; //this will always work due to generic constraint on the Register _writeStream.Seek(0L, SeekOrigin.Begin); _writer.Write(key); c.WriteDataTo(_writer); var length = new IntToBytes((int)_writeStream.Position); serializationStream.WriteByte(length.B0); serializationStream.WriteByte(length.B1); serializationStream.WriteByte(length.B2); serializationStream.WriteByte(length.B3); serializationStream.Write(_writeStream.GetBuffer(), 0, (int)_writeStream.Position); }