protected List<MutableElement> readElements() {
		saveElementsData();
		// die eingelesenen Elemente werden nicht alle vorgehalten, da dies auf Dauer zu viele werden können
		final List<MutableElement> mutableElements = new ArrayList<MutableElement>();
		try {
			
			byte[] bytes;
			if(_elementsFile.isFile() && _elementsFile.canRead()) {
				final FileInputStream in = new FileInputStream(_elementsFile);
				final DataInputStream din = new DataInputStream(in);
				try {
					final byte version = din.readByte();
					if(version == 1) {
						final int size = din.readInt();
						final byte[] readBytes = new byte[size];
						din.readFully(readBytes);
						bytes = readBytes;
					}
					else {
						final String errorMessage = "Elemente der dynamischen Menge " + _mutableSet.getNameOrPidOrId() + " konnten nicht ermittelt werden, unbekannte Version " + version;
						_debug.error(errorMessage);
						throw new RuntimeException(errorMessage);
					}
				}
				finally {
					din.close();
					in.close();
				}
			}
			else {
				if(_elementsFile.exists()) {
					_debug.warning("Datei mit der Elementzugehörigkeit einer dynamischen Menge kann nicht gelesen werden", _elementsFile.getPath());
				}
				bytes = new byte[0];
			}
			final ByteArrayInputStream in = new ByteArrayInputStream(bytes);
			final Deserializer deserializer = SerializingFactory.createDeserializer(_mutableSet.getSerializerVersion(), in);
			assert bytes.length % MutableElement.BYTE_SIZE == 0 : "Format des Byte-Arrays für die Elemente einer Menge " + _mutableSet.getNameOrPidOrId()
			        + " hat sich geändert. Länge muss durch " + MutableElement.BYTE_SIZE + " teilbar sein.";
			int numberOfElements = bytes.length / MutableElement.BYTE_SIZE;
			for(int i = 0; i < numberOfElements; i++) {
				long id = deserializer.readLong();
				long startTime = deserializer.readLong(); // Zeit, ab der das Element zur Menge gehört
				long endTime = deserializer.readLong(); // Zeit, ab der das Element nicht mehr zur Menge gehört
				short simulationVariant = deserializer.readShort(); // Simulationsvariante dieses Objekt, in der es zur Menge hinzugefügt oder aus der Menge entfernt wurde
				final SystemObject object = _mutableSet.getDataModel().getObject(id);

				if(object == null) {
					_debug.warning(
							"Element mit Id '" + id + "' kann nicht der Menge '" + _mutableSet.getPidOrNameOrId()
									+ "' hinzugefügt werden, da es kein System-Objekt hierzu gibt."
					);
				}
				mutableElements.add(new MutableElement(object, startTime, endTime, simulationVariant));
			}
			in.close();
			return mutableElements;
		}
		catch(IllegalArgumentException ex) {
			final String errorMessage = "Elemente der dynamischen Menge '" + _mutableSet.getNameOrPidOrId()
			        + "' konnten nicht ermittelt werden (evtl. wurde die Menge neu angelegt)";
			_debug.finest(errorMessage, ex.getMessage());
		}
		catch(Exception ex) {
			final String errorMessage = "Elemente der dynamischen Menge " + _mutableSet.getNameOrPidOrId() + " konnten nicht ermittelt werden";
			_debug.error(errorMessage, ex);
			throw new RuntimeException(errorMessage, ex);
		}
		return mutableElements;
	}