首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >序列化imageList属性

序列化imageList属性
EN

Stack Overflow用户
提问于 2014-06-12 07:50:50
回答 2查看 311关注 0票数 0

我有一个相册类,它包含标题、描述和封面图像索引的整数值。它还包含一个imageList。

我需要序列化这个obj,虽然imageList是不可序列化的,但是imageListStream是...

我是一个完全的c#菜鸟,所以我会感谢任何可用的指导。

所需的结果将是如下所示:

代码语言:javascript
复制
<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 ...

EN

回答 2

Stack Overflow用户

发布于 2014-06-12 08:14:23

听起来您只需要使用XML类将您的相册类序列化为XmlSerializer。

这样的代码应该可以工作:https://dotnetfiddle.net/yE8RAl

票数 0
EN

Stack Overflow用户

发布于 2014-06-12 09:31:15

一般来说,你可以这样定义你的相册/图片:

代码语言:javascript
复制
[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

代码语言:javascript
复制
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)。

代码语言:javascript
复制
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反序列化回序列化容器类。需要做更多的工作才能将这些映射回所需的类。由于这一部分比其他部分更依赖于您没有提供的信息,因此我将其留给读者作为练习。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24174411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档