IVertex InstanciateNode(Type nodeConcreteType, Guid nodeId, GraphObjectTypeInfo nodeType, string nodeContent, string lang) { List <object> constructorParams = new List <object>(); GraphObjectTypeInfo got = nodeType; string contentString = nodeContent; Type genericType = nodeConcreteType; IVertex v = null; Type vertexContent = typeof(SerializableString); if (vertexContentTypeMap.ContainsKey(got.Id)) { vertexContent = vertexContentTypeMap[got.Id]; } IStringSerializable content = Activator.CreateInstance(vertexContent) as IStringSerializable; content.Deserialize(contentString); Type instanceType = nodeConcreteType; if (nodeConcreteType.IsGenericTypeDefinition) { instanceType = genericType.MakeGenericType(vertexContent); } v = Activator.CreateInstance(instanceType, new object[] { got, content, lang, nodeId }) as IVertex; return(v); }
public Graph ReadGraph(StreamReader sr) { Graph graph = new Graph(); GraphObjectTypeInfo[] aliasTable = new GraphObjectTypeInfo[0]; IVertex[] nodesTable = new IVertex[0]; lineNumber = 0; while (!sr.EndOfStream) { lineNumber++; string line = sr.ReadLine(); string[] parts = line.Split('|'); switch (parts[0]) { case "H": HeaderInfo hInfo = ParseHeader(parts[1]); aliasTable = new GraphObjectTypeInfo[hInfo.DeclaredTypes]; nodesTable = new IVertex[hInfo.Vertices]; break; case "A": TypeInfo typeInfo = ParseTypeDeclaration(line); aliasTable[typeInfo.LocalId] = new GraphObjectTypeInfo(typeInfo.ExternalId, typeInfo.Name, typeInfo.ObjectType); break; case "N": List <object> constructorParams = new List <object>(); GraphObjectTypeInfo got = aliasTable[Int32.Parse(parts[2])]; string contentString = parts[3]; // si un type deserialisable concret est enregistré // on crée une instance 'i' de IStringSerializable à partir du type enregistré // on désérialise la chaîne depuis 'i' // on crée une instance de StringSerializableVertex dont on fixe le contenu à 'i' // sinon // on crée une instance de Vertex<string> et on y la chaîne 'content' Type genericType = typeof(Vertex <>); IVertex v = null; Type vertexContent = typeof(SerializableString); if (vertexContentTypeMap.ContainsKey(got.Id)) { vertexContent = vertexContentTypeMap[got.Id]; } IStringSerializable content = Activator.CreateInstance(vertexContent) as IStringSerializable; content.Deserialize(contentString); Type specializedGenericType = genericType.MakeGenericType(vertexContent); v = Activator.CreateInstance(specializedGenericType, new object[] { got, content }) as IVertex; nodesTable[Int32.Parse(parts[1])] = v; break; case "E": List <IVertex> vertices = new List <IVertex>(); GraphObjectTypeInfo type = aliasTable[Int32.Parse(parts[1])]; foreach (string v_str in parts[2].Split(',')) { vertices.Add(nodesTable[long.Parse(v_str)]); } InstanciateEdge(type, typeof(HyperEdge), vertices); break; } } foreach (IVertex node in nodesTable) { graph.AddVertex(node as IVertex); } return(graph); }