public static void IncludeParents(this RuntimeTypeModel model, ITypeIdentifier typeIdentifier, MetaType type) { if (type.Type.BaseType == typeof(object) || type.Type.BaseType == null) { return; } var metaBase = model.Add(type.Type.BaseType, true); model.IncludeParents(typeIdentifier, metaBase); if (IsRegisteredType(typeIdentifier, type) || IsRegisteredGenericType(typeIdentifier, type)) { foreach (var field in metaBase.GetFields()) { if (!type.GetFields().Select(x => x.FieldNumber).Contains(field.FieldNumber)) { type.AddField(field.FieldNumber, field.Member.Name); } } } }
public Serializer(ITypeIdentifier identifier) { Id = Guid.NewGuid(); proteusTypeModel = new ProteusRuntimeTypeModel(identifier); this.identifier = identifier; protobufTypeModel = ModelBuilder.New(); List<Type> builtProxies = new List<Type>(); var factory = new ProxyFactory(this.identifier, Id); foreach (var item in identifier.GetAvailableTypesAndTheirSerializableParents()) { if (item.IsGenericTypeDefinition) continue; var proxy = factory.GetProxy(item); var metaType = protobufTypeModel.Add(item, false); protobufTypeModel.IncludeParents(identifier, metaType); metaType.SetSurrogate(proxy); builtProxies.Add(proxy); } // builtProxies.Add(px); }