初始化为数组的对象的 XML 序列化

2023-12-10

我的问题可能源于对 XML 序列化的基本误解,但无论如何......
我正在尝试序列化一个包含对象的类,该对象是使用 XMLSerializer 类通过数组初始化的。最小的例子:

using System;
using System.IO;
using System.Xml.Serialization;

namespace XMLSerializationTest
{
class Program
{
    static void Main(string[] args)
    {           
        try
        {                
            string xmlFileName = Environment.CurrentDirectory + @"\somename.xml";
            XmlSerializer writer = new XmlSerializer(typeof(MyClass));
            FileStream file = File.Create(xmlFileName);
            MyClass someclass = new MyClass();
            writer.Serialize(file, someclass);
            file.Close();
        }
        catch (Exception exc)
        {
            Console.WriteLine(exc);
        }
        Console.ReadLine();
    }        
}
public class MyClass
{
    public object myObject;
    public MyClass()
    {
        myObject = new string[1] { "somestring" };
    }
}
}

但是,这会抛出 System.InvalidOperationException,这里不能使用读取数组。如果替换 MyClass 构造函数中的数组(例如,使用像这样的简单字符串),它就可以正常工作myObject = "somestring";。不幸的是,我只是不知道我的对象是否是一个数组。那么有没有可能解决这个问题,例如使用属性还是 XML 在这种情况下是错误的方法?


你的困难源于以下事实:XmlSerializer要求所有类型都序列化为可通过反射静态发现。然而,你的类型MyClass具有多态性object属性,其中子类型的实例object- 具体来说string []——正在存储中。什么时候XmlSerializer遇到它,由于不需要这种类型的对象,序列化器会抛出您看到的异常。

当序列化诸如此类的多态属性时,有必要使用XML 序列化属性声明可以遇到的类型。XmlSerializer提供了两种机制来实现这一点。

  1. 使用声明可能的多态亚型XmlInclude(Type)包含类型的属性。自从string and string []你的可能类型是object财产,你会这样做:

    [XmlInclude(typeof(string))]
    [XmlInclude(typeof(string[]))]
    public class MyClass
    {
        public object myObject { get; set; }
    
        public MyClass()
        {
            myObject = new string[] { "somestring" };
        }
    }
    

    结果 XML 将如下所示:

    <MyClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <myObject xsi:type="ArrayOfString">
            <string>somestring</string>
        </myObject>
    </MyClass>
    

    注意xsi:type属性?这是一个w3c 标准属性允许元素显式断言其类型。它的存在使得XmlSerializer将 XML 反序列化为与最初序列化时相同类型的对象。

    (注意[XmlInclude(typeof(string))]似乎没有必要,因为string显然是一个内置的已知类型 - 尽管我找不到证实这一点的文档。)

  2. 使用声明可能的多态亚型[XmlElement(String, Type)]关于多态属性本身。因此你会做类似的事情:

    public class MyClass
    {
        [XmlElement("myObjectString", typeof(string))]
        [XmlElement("myObjectStringArray", typeof(string[]))]
        public object myObject { get; set; }
    
        public MyClass()
        {
            myObject = new string[] { "somestring" };
        }
    }
    

    生成的 XML 将如下所示:

    <MyClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <myObjectStringArray>
            <string>somestring</string>
        </myObjectStringArray>
    </MyClass>
    

    请注意,该名称的myObject元素已修改为传递到的字符串[XmlElement(String, Type)]属性构造函数。这允许XmlSerializer将 XML 反序列化为与最初序列化时相同类型的对象。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

初始化为数组的对象的 XML 序列化 的相关文章

随机推荐

  • 在 Watin 新版本 2.1 中访问框架时出错

    访问时抛出以下错误ie Frames在新版本的 Watin 2 1 中 错误详情 无法使用已与其底层 RCW 分离的 COM 对象 System Runtime InteropServices InvalidComObjectExcepti
  • 使用 xyz 坐标和 jzy3d 构建 3D 曲面图

    我一直在寻找一种将 coord x y z 列表发送到 jzy3d 的方法 但没有成功 我发现的唯一方法是使用带有 coord3d 列表和 镶嵌器 列表的 构建器 但它实际上不起作用 事实上我真的不明白 Tessellator 的含义 这是
  • 按自定义订单排序

    我想知道如何按自定义顺序而不是按字母顺序对数组进行排序 想象一下你有这个数组 对象 var somethingToSort type fruit name banana type candy name twix type vegetable
  • 管理 @NamedNativeQuery 和架构

    我有很多EntityManager 我拥有的每个模式一个 我使用entity mappings文件来映射 EM 与模式 有用 当我使用 NamedQuery它的工作就像一个魅力 但当我使用 NamedNativeQuery不使用架构 我必须
  • 如何更改 Firebird 上的 CHECK 约束?

    我有一个像这样的 Firebird 表 CREATE TABLE events event VARCHAR 6 NOT NULL CHECK event IN deploy revert fail change id CHAR 40 NOT
  • 使用 pytables 或 pandas 删除表或节点后释放 hdf5 磁盘内存

    我将 HDFStore 与 pandas pytables 一起使用 删除表或对象后 hdf5 文件大小不受影响 当添加额外的对象来存储时 这个空间似乎会被重用 但如果浪费大量空间 这可能会成为一个问题 我在 pandas 或 pytabl
  • 使用 Jquery 停止 Vimeo 视频

    我需要停止嵌入了新的 oembed api 通用播放器 的 Vimeo 视频 但是当我尝试添加事件时出现此错误 Uncaught TypeError Object
  • CSS:修复可变高度元素内部分的高度

    相关这个问题 这是一个小提琴 http jsfiddle net DRbRS 请注意 红色轮廓列表 div 未与绿色容器 div 的底部对齐 问题在于 即使标题的高度已知 也无法提前知道列表的最终高度应该是多少 有什么办法可以在不诉诸jav
  • ES6 模块导入给出“Uncaught SyntaxError:意外标识符”

    对于个人项目 我尝试使用 ES6 import 来编写更清晰的代码 作为第一个测试 我正在编写一个应该生成菜单的对象 当我直接加载类时 整个代码都可以工作 但是当在 ES6 中使用导入和导出时 它会在import线路输入main js 我有
  • 使用 IdentityServer4 身份验证为 ClaimsIdentity 设置自定义声明

    我有一个使用 IdentityServer4 TokenValidation 进行身份验证的 ASP NET Core 2 1 应用程序 authenticationBuilder AddIdentityServerAuthenticati
  • 使用文字创建 Javascript 对象与自定义构造函数

    我知道有多种方法可以在 javascript 中创建对象 并且我一直在阅读对象文字语法通常是首选 正确的 我无法弄清楚是否有理由使用任何其他方法来创建对象 例如自定义构造函数 var p new Person Adam 仅当我想要私有变量或
  • 如何在没有 :nth 伪类的情况下选择元素的前两个子元素?

    我目前正在为高中生网络开发区域锦标赛做准备 准备任务是锦标赛网站要解决的任务之一 我有以下 HTML 代码 h2 Task 5 h2
  • 使用带有访问“连续表单”的未绑定组合框进行钻取

    必须有一种简单的方法来做到这一点 我遇到一种情况 我使用连续形式列出零件 零件清单包含零件类型 制造商 零件编号和数量等信息 该列表包含零件实例和数量 我可以从部件的实例中查找其他内容 因此显示现有部件没有问题 只需使用联接查询来检索相关记
  • LINQ for Java 工具[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 LINQ for java
  • Android - 获取折线作为图像

    如何获取已在 Google 地图上绘制为图像的折线 只有折线 没有地图布局 我已经在 Google 地图上绘制了折线 我想将折线作为图像获取 所以只显示红线 没有任何地图 https i stack imgur com vUqS3 png
  • xpath:选择父级和过滤子级

    给定一个 xml 块
  • 在表单中设置默认值

    我想在我的表单中设置一个默认值 我正在这样做 但没有成功 builder gt add points hidden array data gt 5000 any Idea 如果您想默认设置某些内容 请将其设置在模型对象上 model new
  • Javascript (ES6) 异步回调执行

    当许多异步函数排队时 它们的回调是顺序执行还是并发执行 它们按顺序运行 即使它们可能以异步方式排队 事件在浏览器的称为 Web API 的多线程区域中触发 触发事件 例如 XHR 请求 后异步地 一个事件循环同步地在 JavaScript
  • 好友模板重载运算符 <<:无法解析的外部符号

    我遇到了错误问题 错误 LNK2019 无法解析的外部符号 class std basic ostream gt cdecl cop4530 operator class rob Stack const 6rob YAAAV basic o
  • 初始化为数组的对象的 XML 序列化

    我的问题可能源于对 XML 序列化的基本误解 但无论如何 我正在尝试序列化一个包含对象的类 该对象是使用 XMLSerializer 类通过数组初始化的 最小的例子 using System using System IO using Sy