首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何序列化List<IFilter> (诺基亚成像SDK)?

如何序列化List<IFilter> (诺基亚成像SDK)?
EN

Stack Overflow用户
提问于 2014-11-17 22:09:28
回答 2查看 90关注 0票数 2

我正在尝试保存一个IFilter列表(类型为Interface),这些列表将应用于使用XML序列化的图像,这样用户就可以从他停止的地方编辑相同的图像。

代码语言:javascript
复制
[XmlRoot]
public class ImageProperties
{
    public string ImageName { get; set; }
    public string ImageFilePath { get; set; }
    public List<IFilter> Filters { get; set; }
}

这个是可能的吗?还有另一种方法可以替代吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-17 23:03:58

你可以用IXmlSerializable来实现这一点。假设您可以更改ImageProperties类。

序列化后,您可以通过查看每个筛选器实例并查询它来获取类型。您可以将此类型信息存储在XML中,以便在读取它时知道它是哪种类型,然后只需为每个过滤器调用默认的XML序列化程序。

以下是一个可能的实现。

代码语言:javascript
复制
public class ImageProperties : IXmlSerializable
{
    public string ImageName { get; set; }
    public string ImageFilePath { get; set; }
    public List<IFilter> Filters { get; set; }

    public System.Xml.Schema.XmlSchema GetSchema()
    {
        return null;
    }

    public void ReadXml(System.Xml.XmlReader reader)
    {
        string startEle = reader.Name;            
        reader.ReadStartElement();
        Filters = new List<IFilter>();

        do
        {
            switch (reader.Name)
            {
                case "imgName":
                    ImageName = reader.ReadElementContentAsString();
                    break;
                case "imgFilePath":
                    ImageFilePath = reader.ReadElementContentAsString();
                    break;
                case "filters":
                    reader.ReadStartElement("filters");
                    while (reader.Name.Equals("iFilter"))
                    {
                        XmlSerializer filterSerializer = new XmlSerializer(Type.GetType(reader.GetAttribute("type")));
                        reader.ReadStartElement("iFilter");
                        Filters.Add((IFilter)filterSerializer.Deserialize(reader));
                        reader.ReadEndElement();
                    }
                    reader.ReadEndElement();
                    break; 

                default:
                    reader.ReadOuterXml();
                    break;                  
            }

        } while (reader.Name != startEle);
    }

    public void WriteXml(System.Xml.XmlWriter writer)
    {
        writer.WriteElementString("imgName", ImageName);
        writer.WriteElementString("imgFilePath", ImageFilePath);
        writer.WriteStartElement("filters");            
        foreach (IFilter filter in Filters)
        {
            writer.WriteStartElement("iFilter");
            writer.WriteAttributeString("type", filter.GetType().FullName);
            XmlSerializer filterSerializer = new XmlSerializer(filter.GetType());
            filterSerializer.Serialize(writer, filter);
            writer.WriteEndElement();
        }
        writer.WriteEndElement();
    }
}

如果您有不同类型的筛选器,则会调用实际类型的默认序列化程序,因此将记录它们的唯一属性。

例如,这些过滤器类可用:

代码语言:javascript
复制
public interface IFilter
{
    string SomeCommonProp { get; set;}    
}

[XmlRoot("myFilter")]
public class MyFilter : IFilter
{

    [XmlElement("somemyFilterProp")]
    public string SomeMyFilterProp { get; set; }

    [XmlElement("someCommonProp")]
    public string SomeCommonProp { get; set;}
}

[XmlRoot("myOtherFilter")]
public class MyOtherFilter : IFilter
{
    [XmlElement("someOtherFilterProp")]
    public string SomeOtherFilterProp { get; set; }

    [XmlElement("someCommonProp")]
    public string SomeCommonProp { get; set;}
}

您可以使用如下方式序列化和反序列化IFilters到xml中的两种不同类型的筛选器。

代码语言:javascript
复制
static void Main(string[] args)
{
    ImageProperties props = new ImageProperties();
    props.ImageName = "img.png";
    props.ImageFilePath = "c:\\temp\\img.png";
    props.Filters = new List<IFilter>();
    props.Filters.Add(new MyFilter() { SomeMyFilterProp = "x", SomeCommonProp ="p" });
    props.Filters.Add(new MyOtherFilter() { SomeOtherFilterProp = "y", SomeCommonProp ="p" });

    XmlSerializer s = new XmlSerializer(typeof(ImageProperties));
    using (StreamWriter writer = new StreamWriter(@"c:\temp\imgprops.xml"))
        s.Serialize(writer, props);

    using (StreamReader reader = new StreamReader(@"c:\temp\imgprops.xml"))
    {
        object andBack = s.Deserialize(reader);
    }

    Console.ReadKey();
}

这会产生一个类似于此的XML。

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<ImageProperties>
  <imgName>img.png</imgName>
  <imgFilePath>c:\temp\img.png</imgFilePath>
  <filters>
    <iFilter type="SomeNameSpace.Whatever.MyFilter">
      <myFilter xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <somemyFilterProp>x</somemyFilterProp>
        <someCommonProp>p</someCommonProp>
      </myFilter>
    </iFilter>
    <iFilter type="SomeNameSpace.Whatever.MyOtherFilter">
      <myOtherFilter xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <someOtherFilterProp>y</someOtherFilterProp>
        <someCommonProp>p</someCommonProp>
      </myOtherFilter>
    </iFilter>
  </filters>
</ImageProperties>
票数 1
EN

Stack Overflow用户

发布于 2014-11-17 22:19:06

不是的。接口实例不能序列化。它不知道要“反序列化”到的实现。在这种情况下,它将需要一个具体的类或自定义序列化。

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

https://stackoverflow.com/questions/26982927

复制
相关文章

相似问题

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