我有一个相册类,它包含标题、描述和封面图像索引的整数值。它还包含一个imageList。
我需要序列化这个obj,虽然imageList是不可序列化的,但是imageListStream是...
我是一个完全的c#菜鸟,所以我会感谢任何可用的指导。
所需的结果将是如下所示:
<Album>
<Title>Album Title</Title>
<Description>Some explanation.</Description>
<CoverImgIndx>2</CoverImgIdx>
<Images>
<Image>
<indx>0</indx>
<filepath>"C:\Images\file1.jpg"</filepath>
</Image>
<Image>
<indx>1</indx>
<filepath>"C:\Images\file2.png"</filepath>
</Image>
<Image>
<indx>2</indx>
<filepath>"C:\Images\file3.jpg"</filepath>
</Image>
<Image>
<indx>3</indx>
<filepath>"C:\Images\file4.bmp"</filepath>
</Image>
</Images>
</Album>显然,我需要在反序列化时重新构建imageList ...
发布于 2014-06-12 08:14:23
听起来您只需要使用XML类将您的相册类序列化为XmlSerializer。
这样的代码应该可以工作:https://dotnetfiddle.net/yE8RAl
发布于 2014-06-12 09:31:15
一般来说,你可以这样定义你的相册/图片:
[XmlType(TypeName = "Image")]
public class ImageSerializationContainer
{
[XmlElement(ElementName = "indx")]
public int Index { get; set; }
[XmlElement(ElementName = "filepath")]
public string FilePath { get; set; }
}
[XmlType(TypeName = "Album")]
public class AlbumSerializationContainer
{
public string Title { get; set; }
public string Description { get; set; }
public int CoverImgIndx { get; set; }
public List<ImageSerializationContainer> Images { get; set; }
}然后像这样使用XmlSerializer:
XmlSerializer ser = new XmlSerializer(typeof(AlbumSerializationContainer));
StringWriter sw = new StringWriter();
ser.Serialize(sw, yourObjectToSerialize);
return sw.ToString();但是,我猜您真正想要的是以某种方式将现有类转换为可序列化的形式。
不幸的是,你在你的问题中没有给出太多的东西,所以我不得不做一些假设。现在,其中一些假设肯定是错误的,但根据您提供的信息级别,这是意料之中的。
我将假设您使用的是ImageList类,并且示例中的文件名存储在附加到ImageList Tag property的字符串数组中。您可以随意修改代码以从其他地方获取此值。您没有提供有关如何构建索引值的信息。我假设这些是ImageList.Images collection中的indexes。
有几种方法可以解决你的问题。我将向您展示如何使用AutoMapper将可能是您的类转换为可以序列化的类,然后再序列化它。
下面你可以找到一个完整的例子。请注意,如果您的类与下面提供的类不同,则可能需要更新AutoMapper配置。
我同时演示了这两种方法:将一个类序列化为XML (示例1)和将另一个类转换为可序列化的类(示例2)。
using System;
using System.IO;
using System.Drawing;
using System.Windows.Forms;
using System.Xml.Serialization;
using System.Collections.Generic;
using AutoMapper;
namespace SO24174411
{
class Program
{
static void Main()
{
AlbumSerializationContainer example1 = new AlbumSerializationContainer
{
CoverImgIndx = 2,
Description = "Some explanation.",
Images = new List<ImageSerializationContainer>
{
new ImageSerializationContainer {FilePath = @"C:\Images\file1.jpg", Index = 0},
new ImageSerializationContainer {FilePath = @"C:\Images\file2.png", Index = 1},
new ImageSerializationContainer {FilePath = @"C:\Images\file3.jpg", Index = 2},
new ImageSerializationContainer {FilePath = @"C:\Images\file4.bmp", Index = 3}
},
Title = "Album Title"
};
Console.WriteLine("Example 1");
Console.WriteLine(Serialize(example1));
Album album = new Album
{
CoverImgIndx = 2,
Description = "Some explanation.",
Images = new ImageList(),
Title = "Album Title"
};
SetImages(album.Images, new[]
{
@"C:\Images\file1.jpg",
@"C:\Images\file1.jpg",
@"C:\Images\file2.png",
@"C:\Images\file4.bmp"
});
var example2 = PerformMapping(album);
Console.WriteLine("Example 2");
Console.WriteLine(Serialize(example2));
}
private static AlbumSerializationContainer PerformMapping(Album album)
{
Mapper.CreateMap<Album, AlbumSerializationContainer>();
Mapper.CreateMap<ImageList, List<ImageSerializationContainer>>().ConvertUsing<ImageListconverter>();
AlbumSerializationContainer example2 = Mapper.Map<AlbumSerializationContainer>(album);
return example2;
}
public class ImageListconverter : TypeConverter<ImageList, List<ImageSerializationContainer>>
{
protected override List<ImageSerializationContainer> ConvertCore(ImageList source)
{
if (source == null)
{
return null;
}
List<ImageSerializationContainer> result = new List<ImageSerializationContainer>();
for (int i = 0; i < source.Images.Count; i++)
{
result.Add(new ImageSerializationContainer { FilePath = ((string[])source.Tag)[i], Index = i });
}
return result;
}
}
public static string Serialize(AlbumSerializationContainer a)
{
XmlSerializer ser = new XmlSerializer(typeof(AlbumSerializationContainer));
StringWriter sw = new StringWriter();
ser.Serialize(sw, a);
return sw.ToString();
}
public static void SetImages(ImageList l, string[] names)
{
l.Tag = names;
for(int i=0;i<names.Length;i++)
{
// Aparently you can read names[i] file here if you want
l.Images.Add(new Bitmap(1, 1));
}
}
}
public class Album
{
public string Title { get; set; }
public string Description { get; set; }
public int CoverImgIndx { get; set; }
public ImageList Images { get; set; }
}
[XmlType(TypeName = "Image")]
public class ImageSerializationContainer
{
[XmlElement(ElementName = "indx")]
public int Index { get; set; }
[XmlElement(ElementName = "filepath")]
public string FilePath { get; set; }
}
[XmlType(TypeName = "Album")]
public class AlbumSerializationContainer
{
public string Title { get; set; }
public string Description { get; set; }
public int CoverImgIndx { get; set; }
public List<ImageSerializationContainer> Images { get; set; }
}
}您将能够使用XmlSerializer.Deserialize轻松地将xml反序列化回序列化容器类。需要做更多的工作才能将这些映射回所需的类。由于这一部分比其他部分更依赖于您没有提供的信息,因此我将其留给读者作为练习。
https://stackoverflow.com/questions/24174411
复制相似问题