/// <inheritdoc />
        public byte[] Serialize <TTypeToSerialize>(TTypeToSerialize data, IWireStreamWriterStrategy writer)
        {
            if (data == null)
            {
                throw new ArgumentNullException(nameof(data));
            }
            if (writer == null)
            {
                throw new ArgumentNullException(nameof(writer));
            }

            //Conditional compile this because it's not really very efficient anymore to lookup if a type is serialized.
#if DEBUG || DEBUGBUILD
            if (!serializerStorageService.HasSerializerFor(data.GetType()))
            {
                throw new InvalidOperationException($"Serializer cannot serialize Type: {typeof(TTypeToSerialize).FullName} because it's not registered.");
            }
#endif

            if (!isCompiled)
            {
                throw new InvalidOperationException($"You cannot serialize before compiling the serializer.");
            }

            GetLeastDerivedSerializer(data.GetType()).Write(data, writer);

            return(writer.GetBytes());
        }
Exemple #2
0
        public OneTimeCryptoStreamWriter([NotNull] IWireStreamWriterStrategy dest, [NotNull] ISessionPacketCryptoService sessionCrypto)
            : base(dest, sessionCrypto)
        {
            //The starting state is default
            //The writer can only write when it's in default state.
            WriterState = State.Default;

            //Lazily encrypt the stream's bytes.
            //This means it can ONLY be done once.
            CryptoByteRepresentation = new Lazy <byte[]>(() =>
            {
                WriterState = State.Crypted;
                return(sessionCrypto.ProcessBytes(dest.GetBytes(), 0));
            }, true);
        }