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); } }
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); }
protected bool Equals(BinaryStateMember other) { return(Equals(_stateMember, other._stateMember) && _knownType.Equals(other._knownType)); }