/// <summary>
		/// Serializes the presentation state of the given images to the current state object.
		/// </summary>
		/// <param name="images">The images whose presentation states are to be serialized.</param>
		/// <exception cref="InvalidOperationException">Thrown if the presentation state has already been serialized to a file.</exception>
		public override void Serialize(IEnumerable<IPresentationImage> images)
		{
			AssertNotSerialized();

			// create UIDs if needed now
			PresentationSeriesInstanceUid = CreateUid(PresentationSeriesInstanceUid);
			PresentationSopInstanceUid = CreateUid(PresentationSopInstanceUid);

			_serialized = true;

			var imageList = images.ToList();
			var sopInstanceFactory = new PrototypeSopInstanceFactory {Institution = Institution, StationName = StationName, SpecificCharacterSet = SpecificCharacterSet};
			sopInstanceFactory.InitializeDataSet(imageList.OfType<IImageSopProvider>().First().ImageSop.DataSource, DataSet);

			GeneralSeriesModuleIod generalSeriesModule = new GeneralSeriesModuleIod(DataSet);
			generalSeriesModule.InitializeAttributes();
			generalSeriesModule.SeriesDateTime = PresentationSeriesDateTime;
			generalSeriesModule.SeriesDescription = PresentationContentLabel;
			generalSeriesModule.SeriesInstanceUid = PresentationSeriesInstanceUid;
			generalSeriesModule.SeriesNumber = PresentationSeriesNumber;

			PresentationSeriesModuleIod presentationSeriesModule = new PresentationSeriesModuleIod(DataSet);
			presentationSeriesModule.InitializeAttributes();
			presentationSeriesModule.Modality = Modality.PR;

			SopCommonModuleIod sopCommonModule = new SopCommonModuleIod(DataSet);
			sopCommonModule.SopInstanceUid = PresentationSopInstanceUid;
			sopCommonModule.SopClassUid = PresentationSopClass.Uid;

			PresentationStateIdentificationModuleIod presentationStateIdentificationModule = new PresentationStateIdentificationModuleIod(DataSet);
			presentationStateIdentificationModule.InitializeAttributes();
			presentationStateIdentificationModule.ContentLabel = PresentationContentLabel;
			presentationStateIdentificationModule.InstanceNumber = PresentationInstanceNumber;
			presentationStateIdentificationModule.PresentationCreationDateTime = Platform.Time;

			PerformSerialization(imageList);

			_dicomFile.SourceApplicationEntityTitle = SourceAETitle;
			_dicomFile.MediaStorageSopClassUid = PresentationSopClassUid;
			_dicomFile.MediaStorageSopInstanceUid = PresentationSopInstanceUid;
		}
		/// <summary>
		/// Serializes the presentation state of the given images to the current state object.
		/// </summary>
		/// <param name="images">The images whose presentation states are to be serialized.</param>
		/// <exception cref="InvalidOperationException">Thrown if the presentation state has already been serialized to a file.</exception>
		public override void Serialize(IEnumerable<IPresentationImage> images)
		{
			CheckSerialized(false);

			// create UIDs if needed now
			this.PresentationSeriesInstanceUid = CreateUid(this.PresentationSeriesInstanceUid);
			this.PresentationSopInstanceUid = CreateUid(this.PresentationSopInstanceUid);

			_serialized = true;

			var specificCharacterSet = _specificCharacterSet ?? string.Empty;
			DataSet.SpecificCharacterSet = specificCharacterSet;
			DataSet[DicomTags.SpecificCharacterSet].SetStringValue(specificCharacterSet);

			GeneralEquipmentModuleIod generalEquipmentModule = new GeneralEquipmentModuleIod(this.DataSet);
			generalEquipmentModule.Manufacturer = this.Manufacturer ?? string.Empty; // this one is type 2 - all other GenEq attributes are type 3
			generalEquipmentModule.ManufacturersModelName = string.IsNullOrEmpty(this.ManufacturersModelName) ? null : this.ManufacturersModelName;
			generalEquipmentModule.DeviceSerialNumber = string.IsNullOrEmpty(this.DeviceSerialNumber) ? null : this.DeviceSerialNumber;
			generalEquipmentModule.SoftwareVersions = string.IsNullOrEmpty(this.SoftwareVersions) ? null : this.SoftwareVersions;
			generalEquipmentModule.InstitutionName = string.IsNullOrEmpty(this.Institution.Name) ? null : this.Institution.Name;
			generalEquipmentModule.InstitutionAddress = string.IsNullOrEmpty(this.Institution.Address) ? null : this.Institution.Address;
			generalEquipmentModule.InstitutionalDepartmentName = string.IsNullOrEmpty(this.Institution.DepartmentName) ? null : this.Institution.DepartmentName;
			generalEquipmentModule.StationName = string.IsNullOrEmpty(this.StationName) ? null : this.StationName;

			GeneralSeriesModuleIod generalSeriesModule = new GeneralSeriesModuleIod(this.DataSet);
			generalSeriesModule.InitializeAttributes();
			generalSeriesModule.SeriesDateTime = this.PresentationSeriesDateTime;
			generalSeriesModule.SeriesDescription = this.PresentationContentLabel;
			generalSeriesModule.SeriesInstanceUid = this.PresentationSeriesInstanceUid;
			generalSeriesModule.SeriesNumber = this.PresentationSeriesNumber;

			PresentationSeriesModuleIod presentationSeriesModule = new PresentationSeriesModuleIod(this.DataSet);
			presentationSeriesModule.InitializeAttributes();
			presentationSeriesModule.Modality = Modality.PR;

			SopCommonModuleIod sopCommonModule = new SopCommonModuleIod(this.DataSet);
			sopCommonModule.SopInstanceUid = this.PresentationSopInstanceUid;
			sopCommonModule.SopClassUid = this.PresentationSopClass.Uid;

			PresentationStateIdentificationModuleIod presentationStateIdentificationModule = new PresentationStateIdentificationModuleIod(this.DataSet);
			presentationStateIdentificationModule.InitializeAttributes();
			presentationStateIdentificationModule.ContentLabel = this.PresentationContentLabel;
			presentationStateIdentificationModule.InstanceNumber = this.PresentationInstanceNumber;
			presentationStateIdentificationModule.PresentationCreationDateTime = Platform.Time;

			PerformSerialization(images);

			_dicomFile.SourceApplicationEntityTitle = this.SourceAETitle;
			_dicomFile.MediaStorageSopClassUid = this.PresentationSopClassUid;
			_dicomFile.MediaStorageSopInstanceUid = this.PresentationSopInstanceUid;
		}