Esempio n. 1
0
        private void WriteAssemblyQualifiedNameIfNeeded(BinaryStateMember member, Type runtimeType)
        {
            if (member != null && member.HeaderHandled)
            {
                return;
            }

            // If member == null is a patch because the way we implemented route in
            // SlowGraphClimber.
            if ((member != null) &&
                ((member.KnownType) ||
                 (member.MemberType == runtimeType)))
            {
                _writer.Write(ReadWriteHeader.KnownType);
            }
            else
            {
                string assemblyQualifiedName = runtimeType.AssemblyQualifiedName;

                if (string.IsNullOrEmpty(assemblyQualifiedName))
                {
                    throw new NotSupportedException(
                              "Serializing types without assembly qualified name is not supported (yet).");
                }

                _writer.Write(ReadWriteHeader.UnknownType);
                _writer.Write(assemblyQualifiedName);
            }
        }
Esempio n. 2
0
        public void Process <T>(IReadOnlyValueDescriptor <T> descriptor)
        {
            T objectToSerialize = descriptor.Get();

            var runtimeType = objectToSerialize.GetType();

            BinaryStateMember member = descriptor.StateMember as BinaryStateMember;

            WriteAssemblyQualifiedNameIfNeeded(member, runtimeType);

            descriptor.Climb();
        }
        private bool TryReadReferenceType <T>(IWriteOnlyExactValueDescriptor <T> descriptor, out Type type)
            where T : class
        {
            BinaryStateMember member = (BinaryStateMember)descriptor.StateMember;

            type = member.RuntimeType;

            if (member.HeaderHandled)
            {
                return(true);
            }

            byte header = _reader.ReadByte();

            if (header == ReadWriteHeader.Null)
            {
                descriptor.Set(null);
            }
            else if (header == ReadWriteHeader.Revisited)
            {
                HandleVisited(descriptor);
            }
            else
            {
                if (!member.KnownType &&
                    (header == ReadWriteHeader.UnknownType))
                {
                    string assemblyQualifiedName = _reader.ReadString();

                    type = Type.GetType(assemblyQualifiedName);

                    return(true);
                }

                if (header == ReadWriteHeader.KnownType)
                {
                    return(true);
                }

                throw new Exception(
                          "Read an unknown header - probably a mismatch between reader and writer - i.e: a bug :(");
            }

            return(false);
        }
Esempio n. 4
0
 protected bool Equals(BinaryStateMember other)
 {
     return(Equals(_stateMember, other._stateMember) && _knownType.Equals(other._knownType));
 }