命名空间更改后 DataContractSerializer 兼容性

2023-12-02

我有一个类需要序列化。

namespace serializedobject
{
[DataContract]
public class Class1
{
    string string1_;
    string string2_;
    EntityA entity_;

    [DataMember]
    public string string3
    {
        get { return string1_; }
        set { string1_ = value; }
    }

    [DataMember]
    public string string2
    {
        get { return string2_; }
        set { string2_ = value; }
    }
    [DataMember]
    public EntityA Entity
    {
        get { return entity_; }
        set { entity_ = value; }
    }

    public static Class1 FromXML(string desc)
    {
        using (MemoryStream ms = new MemoryStream())
        {
            StreamWriter writer = new StreamWriter(ms);
            writer.Write(desc);
            writer.Flush();

            ms.Seek(0, 0);
            DataContractSerializer ser = new DataContractSerializer(typeof(Class1));
            return (Class1)ser.ReadObject(ms);
        }
    }

    public string ToXML()
    {
        using (MemoryStream ms = new MemoryStream())
        {
            DataContractSerializer ser = new DataContractSerializer(typeof(Class1));
            ser.WriteObject(ms, this);
            ms.Seek(0, 0);
            StreamReader reader = new StreamReader(ms);
            return reader.ReadToEnd();
        }
    }
}

[DataContract]
public class EntityA
{
    string name_;
    [DataMember]
    public string Name
    {
        get { return name_; }
        set { name_ = value; }
    }
}
}

它与 FromXML 和 ToXML 配合得很好。序列化上下文之一,例如:

<Class1 xmlns="http://schemas.datacontract.org/2004/07/serializedobject"    xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><Entity><Name>az</Name></Entity><string2 i:nil="true"/><string3>test</string3></Class1>

后来我需要将类 EntityA 移动到另一个名称空间“外部”,现在序列化上下文如下:

<Class1 xmlns="http://schemas.datacontract.org/2004/07/serializedobject" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><Entity xmlns:a="http://schemas.datacontract.org/2004/07/outside"><a:Name>az</a:Name></Entity><string2 i:nil="true"/><string3>test</string3></Class1>

但现在更改命名空间之前创建的序列化xml无法正确反序列化。我想这是因为类“EntityA”更改了命名空间(添加了 xmlns:a)。 有人以前遇到过这个问题吗?有什么建议吗?


您可以通过指定来停止将命名空间添加到 XML[DataContract(Namespace="")]。这依赖于您在保存任何 xml 代码之前设置该属性。

仅当您尚未序列化任何数据时才可以使用此方法,因此这是您在首次设计要序列化的类时使用的方法。

(如果您已经获得了必须处理的序列化数据,请参阅下面我的答案的第二部分。)

此代码示例有两个类,称为Demo在两个不同的命名空间中,Test1 and Test2.

我们使用一个命名空间中的类序列化代码,并使用另一个命名空间中的类反序列化代码:

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

namespace ConsoleApp1
{
    namespace Test1
    {
        [DataContract(Namespace="")]

        public sealed class Demo
        {
            [DataMember]
            public string Value { get; set; }
        }
    }

    namespace Test2
    {
        [DataContract(Namespace="")]

        public sealed class Demo
        {
            [DataMember]
            public string Value { get; set; }
        }
    }

    sealed class Program
    {
        private void run()
        {
            string filename = Path.GetTempFileName();
            var demo1 = new Test1.Demo {Value = "DEMO"};
            ToFile(filename, demo1);

            var demo2 = FromFile<Test2.Demo>(filename);
            Console.WriteLine(demo2.Value);
        }

        public static void ToFile(string filename, object obj)
        {
            DataContractSerializer serializer = new DataContractSerializer(obj.GetType());

            using (var streamWriter = File.CreateText(filename))
            using (var xmlWriter    = XmlWriter.Create(streamWriter, new XmlWriterSettings{Indent = true}))
            {
                serializer.WriteObject(xmlWriter, obj);
            }
        }

        public static T FromFile<T>(string filename)
        {
            DataContractSerializer serializer = new DataContractSerializer(typeof(T));

            using (var textReader = File.OpenText(filename))
            using (var xmlReader  = XmlReader.Create(textReader))
            {
                return (T)serializer.ReadObject(xmlReader);
            }
        }

        [STAThread]
        static void Main(string[] args)
        {
            new Program().run();
        }
    }
}

如果您已经序列化数据而没有Namespace=""属性,那么您需要将适当的命名空间应用于新类:

namespace Test1
{
    [DataContract]

    public sealed class Demo
    {
        [DataMember]
        public string Value { get; set; }
    }
}

namespace Test2
{
    // Note the namespace includes both nested namespaces, i.e. ConsoleApp1.Test1

    [DataContract(Namespace="http://schemas.datacontract.org/2004/07/ConsoleApp1.Test1")]

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

命名空间更改后 DataContractSerializer 兼容性 的相关文章

  • 确保 StreamReader 不会挂起等待数据

    下面的代码读取从 tcp 客户端流读取的所有内容 并且在下一次迭代中它将仅位于 Read 上 我假设正在等待数据 我如何确保它不会在没有任何内容可供读取时返回 我是否必须设置低超时 并在失败时响应异常 或者有更好的办法吗 TcpClient
  • 提交后禁用按钮

    当用户提交付款表单并且发布表单的代码导致 Firefox 中出现重复发布时 我试图禁用按钮 去掉代码就不会出现这个问题 在firefox以外的任何浏览器中也不会出现这个问题 知道如何防止双重帖子吗 System Text StringBui
  • 在 DataView 的 RowFilter 中选择 DISTINCT

    我试图根据与另一个表的关系缩小 DataView 中的行范围 我使用的 RowFilter 如下 dv new DataView myDS myTable id IN SELECT DISTINCT parentID FROM myOthe
  • 复制目录内容

    我想将目录 tmp1 的内容复制到另一个目录 tmp2 tmp1 可能包含文件和其他目录 我想使用C C 复制tmp1的内容 包括模式 如果 tmp1 包含目录树 我想递归复制它们 最简单的解决方案是什么 我找到了一个解决方案来打开目录并读
  • 单个对象的 Monogame XNA 变换矩阵?

    我读过一些解释 XNA Monogame 变换矩阵的教程 问题是这些矩阵应用于 SpriteBatch Begin matrix 这意味着所有 Draw 代码都将被转换 如何将变换矩阵应用于单个可绘制对象 就我而言 我想转换滚动背景 使其自
  • 如何区分用户点击链接和页面自动重定向?

    拥有 C WebBrowser control http msdn microsoft com en us library system windows forms webbrowser aspx在我的 WinForms 应用程序中 并意识
  • 如何使用 LINQ2SQL 连接两个不同上下文的表?

    我的应用程序中有 2 个数据上下文 不同的数据库 并且需要能够通过上下文 B 中的表的右连接来查询上下文 A 中的表 我该如何在 LINQ2SQL 中执行此操作 Why 我们正在使用 SaaS 产品来跟踪我们的时间 项目等 并希望向该产品发
  • 由 IHttpClientFactory 注入时模拟 HttpClient 处理程序

    我创建了一个自定义库 它会自动为依赖于特定服务的 Polly 策略设置HttpClient 这是使用以下方法完成的IServiceCollection扩展方法和类型化客户端方法 一个简化的例子 public static IHttpClie
  • 具有交替类型的可变参数模板参数包

    我想知道是否可以使用参数包捕获交替参数模式 例如 template
  • Azure 辅助角色“请求输入之一超出范围”的内部异常。

    我在辅助角色中调用 CloudTableClient CreateTableIfNotExist 方法 但收到一个异常 其中包含 请求输入之一超出范围 的内部异常 我做了一些研究 发现这是由于将表命名为非法表名引起的 但是 我尝试为我的表命
  • Cmake 链接共享库:包含库中的头文件时“没有这样的文件或目录”

    我正在学习使用 CMake 构建库 构建库的代码结构如下 include Test hpp ITest hpp interface src Test cpp ITest cpp 在 CMakeLists txt 中 我用来构建库的句子是 f
  • 如何在非控制台应用程序中查看 cout 输出?

    输出到调试窗口似乎相当繁琐 我在哪里可以找到cout如果我正在编写非控制台信息 则输出 Like double i a b cout lt lt b lt lt endl I want to check out whether b is z
  • 使用 %d 打印 unsigned long long

    为什么我打印以下内容时得到 1 unsigned long long int largestIntegerInC 18446744073709551615LL printf largestIntegerInC d n largestInte
  • 使用 C# 读取 Soap 消息

  • 按 Esc 按键关闭 Ajax Modal 弹出窗口

    我已经使用 Ajax 显示了一个面板弹出窗口 我要做的是当用户按 Esc 键时关闭该窗口 这可能吗 如果有人知道这一点或以前做过这一点 请帮助我 Thanks 通过以下链接 您可以通过按退出按钮轻松关闭窗口 http www codepro
  • 调用堆栈中的“外部代码”是什么意思?

    我在 Visual Studio 中调用一个方法 并尝试通过检查调用堆栈来调试它 其中一些行标记为 外部代码 这到底是什么意思 方法来自 dll已被处决 外部代码 意味着该dll没有可用的调试信息 你能做的就是在Call Stack窗口中单
  • 方法优化 - C#

    我开发了一种方法 允许我通过参数传入表 字符串 列数组 字符串 和值数组 对象 然后使用这些参数创建参数化查询 虽然它工作得很好 但代码的长度以及多个 for 循环散发出一种代码味道 特别是我觉得我用来在列和值之间插入逗号的方法可以用不同的
  • 如何部署“SQL Server Express + EF”应用程序

    这是我第一次部署使用 SQL Server Express 数据库的应用程序 我首先使用实体 框架模型来联系数据库 我使用 Install Shield 创建了一个安装向导来安装应用程序 这些是我在目标计算机中安装应用程序所执行的步骤 安装
  • 我的班级应该订阅自己的公共活动吗?

    我正在使用 C 3 0 遵循标准事件模式我有 public event EventHandler
  • 如何从 ODBC 连接获取可用表的列表?

    在 Excel 中 我可以转到 数据 gt 导入外部数据 gt 导入数据 然后选择要使用的数据源 然后在提供登录信息后 它会给我一个表格列表 我想知道如何使用 C 以编程方式获取该列表 您正在查询什么类型的数据源 SQL 服务器 使用权 看

随机推荐

  • Mysql如何连接表[关闭]

    Closed 这个问题需要调试细节 目前不接受答案 我有三张桌子 表 1 包含一个主键 表 2 包含与表 1 的主键相同的外键 表 3 包含与表 2 的主键相同的外键 问题 是否可以在只知道表1的主键的情况下从表2和表3中选择信息 如果是这
  • SQL Server 2008 - 如果不存在则插入其他更新

    我很抱歉 但这是一个由两部分组成的问题 我对 SQL 非常陌生 正在尝试为我工作的小型办公室开发一个时钟应用程序 我现在正在使用 SQL 后端 并且有一个关于复合语句的问题 我遇到的问题是 如果用户尝试下班休息但从未在轮班开始时签到 SQL
  • PowerPoint 中所有幻灯片的叠加项目

    我想制作一个 PowerPoint 插件来在每张幻灯片上显示一些小的 html css 组件 而不是每次添加新幻灯片时都添加插件 我应该寻找什么 可以通过一些 Office 加载项和命令 API 来完成吗 在 PowerPoint 中 添加
  • 文件写入器覆盖先前写入的 Java

    try File file new File filePath usedcommands txt if file exists file createNewFile FileWriter fw new FileWriter file get
  • GCC 位向前扫描以查找下一个设置位?

    我有一个uint64 t我想找到第一个设置位的索引 将其重置为零并找到下一个设置位 我如何知道何时终止 全零的 BSF 未定义 const uint64 t input source if 0 input int32 t setIndex
  • Spark Scala 2.10 元组限制

    我有 66 列的 DataFrame 需要处理 几乎每个列值都需要以某种方式更改 所以我正在运行以下语句 val result data map row gt modify row getString row fieldIndex XX 直
  • 如何使用 NFC 重定向或打开我的渐进式 Web 应用程序?

    我有一个渐进式网络应用程序 app example com在 Android 上使用 Chrome 的 添加到主屏幕 按钮创建 我有一个通常会打开的 NFC 标签app example com nfc app在 Chrome 中 当点击它时
  • 如何从此结果集创建一个数组(使用遍历模型存储在数据库中的嵌套类别)?

    基于这个问题 将修改后的先序树遍历模型 嵌套集 放入 中 下面的逻辑用于构建有序列表 但是如何对数组执行相同的操作 我想构建一个嵌套数组 bootstrap loop result currDepth 1 1 to get the oute
  • 使用不透明访问令牌是否会使我的服务器有状态?

    我试图在身份验证的背景下理解 Restful API 中的无状态性 这是场景 用户登录 服务器验证用户名和密码 并生成不透明的访问令牌 它缓存与此令牌相关的一些信息 例如 过期时间 userId 此令牌在过期之前是否已显式失效等 令牌被发送
  • 使用类型擦除在 Swift 函数中返回通用类型(无法转换类型的返回表达式...)

    我对 swift 中的泛型有疑问 让我们公开我的代码 protocol FooProtocol associatedtype T protocol Fooable extension Int Fooable extension String
  • 为什么 ARC 禁止调用未声明的方法?

    当使用手动内存管理时 我们可以编写对类中未声明的方法的调用 在这种情况下 我们在编译过程中得到的只是警告 这是维基百科对 Objective C 最独特的功能之一的描述 面向对象编程的 Objective C 模型基于向对象实例传递消息 在
  • Android 多重通知避免更新时闪烁

    我正在开发这样的应用程序 它使用多个通知 其中每个通知都有播放暂停图标 用于执行音乐播放器的播放 暂停 但更新通知时会出现奇怪的行为 这些通知在更新时会不断闪烁 我的代码如下 SuppressLint NewApi public void
  • 默认情况下,Windows 内存映射文件内容是否始终归零?

    我凭经验确定 在我的系统上 创建为特定大小的内存映射文件在默认情况下总是完全清零 例如 使用调用 HANDLE hMM CreateFileMapping h NULL PAGE READWRITE 0 0x01400000 20MB NU
  • 如何读取多个XML节点? (创新设置)

    这是我想要读取的 XML 我有同名的节点 我想访问节点以在组合框中显示国家 地区并在列表框中显示货币 XML 如下所示
  • 配置面板的垂直菜单

    我想创建像这个例子这样的配置面板 问题是我不知道如何在左侧创建垂直菜单 你能举一些类似菜单的例子吗 package verticalmenubar import javafx application Application import j
  • Flash 还是 Flex 更适合构建用户交互式订购“向导”网站?

    我想看看这些是否 构建了一个 flash 站点 支持用户定制的订购流程 是使用常规 flash 还是 Flex 完成的 Site 1 Site 2 Site 3 Site 4 所有这些都 引导用户 完成定制的订购流程并捕获他们的所有选择并向
  • 如何在 Bootstrap 中更改 btn 颜色

    有没有办法改变一切 btnBootstrap 中的属性 我已经尝试过以下内容 但有时它仍然显示默认的蓝色 例如单击并移除鼠标等后 我怎样才能完全改变整个主题 btn primary btn primary hover btn primary
  • Python MySQLdb 未导入

    我已经使用安装了mysql服务器 sudo apt get install mysql server 然后我使用安装了 python mysqldb sudo apt get install python mysqldb 但是当我在 pyt
  • 在 CSS 文件中访问 Ruby 中的区域设置

    所以我在一个项目中使用 CSS JS 和 Ruby 现在我在 ruby 中设置了位置等 但我想在我的 css 文件上访问它们 这是为了自定义特定区域设置的视图 我在我的控制器中完成了以下操作 before filter set locale
  • 命名空间更改后 DataContractSerializer 兼容性

    我有一个类需要序列化 namespace serializedobject DataContract public class Class1 string string1 string string2 EntityA entity Data