XmlSerializer:“在此上下文中不能使用类型‘Type’”

2023-12-15

我试图找出如何使用序列化任何类Xml序列化器,不使用Xml包含属性。通常可以工作,但使用以下代码时出现异常:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Xml.Serialization;

namespace Test
{
    public class ReactObject { }

    public class ReactListObject : ReactObject { }

    public class ReactList<T> : ReactObject, ICollection, IList<T>
    {
        public ReactList() { }

        public virtual void AddRange(IEnumerable<T> values) { }

        [XmlArray(ElementName = "Items", IsNullable = false)]
        public T[] Items
        {
            get { lock (SyncRoot) { return (ItemsList.ToArray()); } }
            set { lock (SyncRoot) { ItemsList = new List<T>(value); } }
        }

        protected List<T> ItemsList = new List<T>();

        public bool IsSynchronized { get { return (true); } }
        public object SyncRoot { get { return (mRootObject); } }

        private object mRootObject = new object();

        public void CopyTo(Array array, int index) { CopyTo(array, index); }

        [XmlIgnore()]
        public T this[int index] {
            get { return (ItemsList[index]); }
            set { ItemsList[index] = value; }
        }

        public int IndexOf(T item) { return (ItemsList.IndexOf(item)); }

        public virtual void Insert(int index, T item) { }

        public virtual void RemoveAt(int index) { }

        public int Count { get { lock (SyncRoot) { return (ItemsList.Count); } } }

        public bool IsReadOnly { get { return (false); } }

        public virtual void Add(T item) { ItemsList.Add(item); }

        public void Clear() { }

        public bool Contains(T item) { return (false); }

        public virtual void CopyTo(T[] array, int arrayIndex) { }

        public virtual bool Remove(T item) { return (false); }

        public IEnumerator<T> GetEnumerator() { return (ItemsList.GetEnumerator()); }

        IEnumerator IEnumerable.GetEnumerator() { return (ItemsList.GetEnumerator()); }
    }

    [XmlInclude(typeof(B))]
    public class A : ReactListObject
    {
        public int AValue = 1;
    }

    public class B : A
    {
        public int BValue = 2;
    }

    public class AList : ReactList<A>
    {

    }

    static class Program
    {
        [STAThread]
        static void Main()
        {
            // NOT good serializer for the type AList
            XmlSerializer ser1 = new XmlSerializer(typeof(ReactObject), new Type[] { typeof(A), typeof(B), typeof(ReactList<A>), typeof(AList) });
            // Good serializer for the type AList
            XmlSerializer ser2 = new XmlSerializer(typeof(ReactList<A>), new Type[] { typeof(A), typeof(B), typeof(AList) });
            AList list = new AList();

            list.Add(new A());
            list.Add(new B());

            using (FileStream mStream = new FileStream("C:\\Test.xml", FileMode.Create)) {
                ser2.Serialize(mStream, list);
            }
            using (FileStream mStream = new FileStream("C:\\Test.xml", FileMode.Create)) {
                ser1.Serialize(mStream, list);
            }
        }
    }
}

抛出的异常是

类型 Test.AList 不能在此上下文中使用


这是类图,以帮助阅读代码

Da Develop

我想花更多的时间来描述我想要实现的目标:我想最大限度地减少 XML 序列化器实例的创建(实际上,序列化的每种类型都有自己的序列化器;应用程序每次都会重新创建唯一存在的序列化器)未包含的类型应被序列化。(*)

看来,恕我直言,

  • 可以序列化任何反应对象(和派生类型)与类型的序列化器反应对象,直到在派生层次结构中引入泛型类。序列化器的额外类型应涵盖所有预期类型。
  • 在这种情况下,类型派生自泛型类基于反应对象,该类型无法使用类型的序列化器序列化反应对象,但具有通用类型的序列化器。

这可能是一个问题,因为当我需要反序列化它时,我必须知道序列化对象的类型。相反,反序列化“非泛型”反应对象type 足以使用 type 的通用序列化器反应对象,而不知道序列化对象的确切类型。

(*) 实际上我不知道这个目标会带来明显的改进。核心问题是“对于所有(包含的)类型使用单个序列化程序集更好,还是对于每种类型使用序列化程序集更好?"


Does ReactListObject继承自ReactObject? ser1被实例化以序列化类型ReactObject,但从你的代码示例我只能看出list属于类型ReactListObject.

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

XmlSerializer:“在此上下文中不能使用类型‘Type’” 的相关文章

随机推荐

  • Prolog IntList 定义

    如果 IntList 由单调递增的 gt 整数后跟单调递减的整数组成 hill IntList 成功 例如 gt 1 2 5 8 11 6 3 1 是一座小山 但 1 2 5 8 11 6 9 3 1 和 1 2 3 4 5 6 gt 不是
  • SSRS 2008 Word 导出无法横向打印

    我有许多 SSRS 2008 报告需要以横向模式导出到 word 导出时 报告看起来很棒 但当您尝试打印 甚至预览 页面时 Word 似乎尝试以纵向模式打印报告 因此会截断距离页面最左侧超过 8 5 英寸的所有内容 我已确保已进行以下设置
  • 画布像素数据的跨浏览器规范?

    有谁知道当前画布像素数据规范在各种浏览器中可以追溯到多远 如果 没那么远 之前的规格是什么 当你调用或推送像素时 你得到 发送 ImageData data Uint8ClampedArray width Number height Num
  • 处理 Grails 中一对多关系的动态形式参数

    我在这里的主要问题是在一个动态表单中管理一对多关系时处理 pramas 映射 以及通过动态表单编辑 更新域对象时处理一对多的最佳实践 我的问题的输入如下 我已经成功破解了一个表单 该表单允许我在一个动态表单中创建如下所示的域对象 因为没有必
  • 如何从PictureBox中获取真实图像像素点x,y

    我有一个pictureBox2并且它被设置为zoom 我试图找出如何获得图像上真实的 x y 像素位置Mouse Click on pictureBox2 但我尝试了我所知道的 3 种可能的想法 不带 带PointToClient Poin
  • Android 中的全局计时器

    我想制作一个计时器 它将显示在我的应用程序的每个活动中 我知道如何在活动上设置计时器 下面是我的代码 public class Timer extends Activity implements OnClickListener public
  • 德摩根定律和 C++

    对于以下每个表达式 编写等效的 C 表达式 不带任何一元否定运算符 仍然允许 使用德摩根定律 P Q P Q P Q P Q For x 5 x 7 x lt 5 x gt 7 a gt 3 b gt 4 c 5 我的回答 x gt 5 x
  • Flutter:我想在下拉颤动下显示下拉列表

    我想创建看起来像我提到的下拉菜单 但我无法实现我的方面结果 我尝试使用渲染框来制作自定义下拉菜单 但它希望感觉像实际的下拉菜单 谁能帮助我得到这种类型的结果 我想要这样的结果 我当前的用户界面如下所示 这是我的代码 class AppDro
  • 在 rCharts/slidify/nvd3 中设置图表区域背景颜色

    对于以下滑动甲板 title Foo framework revealjs io2012 html5slides shower dzslides revealjs theme solarized highlighter highlight
  • 如何在 ASP.NET Identity 中使用 ASP.NET 会员数据库?

    我有几个旧版 ASP NET Web 应用程序共享 ASP NET 成员资格数据库 我想迁移到利用 NET Core 和 IdentityServer4 的微服务架构 并在新的微服务生态系统中拥有身份服务器以使用现有的 ASP NET 会员
  • Azure PowerShell:启用应用程序诊断和站点诊断

    我正在为 Azure 网站配置诊断和 IIS 日志 Azure 管理门户显示将应用程序诊断存储到 Azure 表存储的选项 单击 管理表存储 时会弹出一个对话框以提供 Azure 表详细信息 Blob 存储的站点诊断 我正在搜索 Azure
  • 创建同步 http.get()

    我试图通过 Promise 和 http get 处理登录 但我失败得很厉害 我收到以下错误 对象不支持属性或方法 toPromise 我的代码是 return this http get http localhost 5000 login
  • 强制 ANTLR 在特定文件夹中生成输出文件

    我不喜欢将 ANTLR 生成的文件放在与我的文件相同的位置 g4语法和其他版本控制文档 我想将所有生成的文件放在一个单独的嵌套文件夹中 可以通过排除 gitignore 到目前为止我尝试过的是创建一个文件夹
  • 为什么 FB.XFBML.parse() 不渲染我的插件?

    My code a href Render me a div div render me click function e e preventDefault social facebook html
  • Android Studio:用于编码 UTF-8 的不可映射字符

    将我的项目从 eclipse 导入 android studio 后 出现以下错误 Error unmappable character for encoding UTF 8 安卓工作室 0 5 8 我遇到了同样的问题 因为存在带有 win
  • AVX2 中的条件指令

    您能给出 AVX2 中可用的条件指令列表吗 到目前为止 我发现了以下内容 mm256 blendv 可供选择a and b基于掩码c 是否有条件乘法和条件加法等 另外 如果接受指示imm8计数 比如 mm256 blend 你能解释一下如何
  • 特定属性的 SequenceEqual

    我想比较两个对象列表 这些对象有四种不同的属性 我只需要比较其中的三个作为序列 只有三个 因为其中一个总是不同的 示例如下 list1 new List
  • DEI原则下Ctor参数应该注入什么?

    我试图了解哪些对象应该注入到对象中 哪些对象应该在内部创建 如果我有一些List
  • 加密文件时减少内存消耗 C#

    我的加密应用程序使用了大量内存 它根本无法处理大文件 如何优化我的代码来处理大文件 我正在使用下面的代码将文件转换为 base64 显着增加文件大小 Console Write Enter File Path docPath Console
  • XmlSerializer:“在此上下文中不能使用类型‘Type’”

    我试图找出如何使用序列化任何类Xml序列化器 不使用Xml包含属性 通常可以工作 但使用以下代码时出现异常 using System using System Collections using System Collections Gen