命名空间更改后 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 兼容性 的相关文章

  • 创建 DirectoryEntry 实例以供测试使用

    我正在尝试创建 DirectoryEntry 的实例 以便可以使用它来测试将传递 DirectoryEntry 的一些代码 然而 尽管进行了很多尝试 我还是找不到实例化 DE 并初始化它的 PropertyCollection 的方法 我有
  • 属性对象什么时候创建?

    由于属性实际上只是附加到程序集的元数据 这是否意味着属性对象仅根据请求创建 例如当您调用 GetCustomAttributes 时 或者它们是在创建对象时创建的 或者 前两个的组合 在由于 CLR 的属性扫描而创建对象时创建 从 CLR
  • 自动从 C# 代码进行调试过程并读取寄存器值

    我正在寻找一种方法来读取某个地址的 edx 注册表 就像这个问题中所问的那样 读取eax寄存器 https stackoverflow com questions 16490906 read eax register 虽然我的解决方案需要用
  • 如何在C++中实现模板类协变?

    是否可以以这样一种方式实现类模板 如果模板参数相关 一个对象可以转换为另一个对象 这是一个展示这个想法的例子 当然它不会编译 struct Base struct Derived Base template
  • 如何在没有 Control.Invoke() 的情况下从后台线程修改控件属性

    最近 我们遇到了一些旧版 WinForms 应用程序 我们需要更新一些新功能 在专家测试该应用程序时 发现一些旧功能被破坏 无效的跨线程操作 现在 在您认为我是新手之前 我确实有一些 Windows 窗体应用程序的经验 我不是专家 但我认为
  • fgets() 和 Ctrl+D,三次才能结束?

    I don t understand why I need press Ctrl D for three times to send the EOF In addition if I press Enter then it only too
  • Cygwin 下使用 CMake 编译库

    我一直在尝试使用 CMake 来编译 TinyXML 作为一种迷你项目 尝试学习 CMake 作为补充 我试图将其编译成动态库并自行安装 以便它可以工作 到目前为止 我已经设法编译和安装它 但它编译成 dll 和 dll a 让它工作的唯一
  • 为什么 POSIX 允许在只读模式下超出现有文件结尾 (fseek) 进行搜索

    为什么寻找文件结尾很有用 为什么 POSIX 让我们像示例中那样在以只读方式打开的文件中进行查找 c http en cppreference com w c io fseek http en cppreference com w c io
  • 为什么禁止在 constexpr 函数中使用 goto?

    C 14 对你能做什么和不能做什么有规则constexpr功能 其中一些 没有asm 没有静态变量 看起来相当合理 但标准也不允许goto in constexpr功能 即使它允许其他控制流机制 这种区别背后的原因是什么 我以为我们已经过去
  • C# 中可空类型是什么?

    当我们必须使用nullable输入 C net 任何人都可以举例说明 可空类型 何时使用可空类型 https web archive org web http broadcast oreilly com 2010 11 understand
  • HttpClient 像浏览器一样请求

    当我通过 HttpClient 类调用网站 www livescore com 时 我总是收到错误 500 可能服务器阻止了来自 HttpClient 的请求 1 还有其他方法可以从网页获取html吗 2 如何设置标题来获取html内容 当
  • 当 Cortex-M3 出现硬故障时如何保留堆栈跟踪?

    使用以下设置 基于 Cortex M3 的 C gcc arm 交叉工具链 https launchpad net gcc arm embedded 使用 C 和 C FreeRtos 7 5 3 日食月神 Segger Jlink 与 J
  • .Net Core / 控制台应用程序 / 配置 / XML

    我第一次尝试使用新的 ConfigurationBuilder 和选项模式进入 Net Core 库 这里有很多很好的例子 https docs asp net en latest fundamentals configuration ht
  • 为什么模板不能位于外部“C”块内?

    这是一个后续问题一个答案 https stackoverflow com questions 4866433 is it possible to typedef a pointer to extern c function type wit
  • 编译的表达式树会泄漏吗?

    根据我的理解 JIT 代码在程序运行时永远不会从内存中释放 这是否意味着重复调用 Compile 表达式树上会泄漏内存吗 这意味着仅在静态构造函数中编译表达式树或以其他方式缓存它们 这可能不那么简单 正确的 他们可能是GCed Lambda
  • 如何在 Team Foundation 上强制发表有意义的签入评论?

    我有一个开发团队有一个坏习惯 他们写道poor签入评论 当我们必须在团队基础上查看文件的历史记录时 这使得它成为一场噩梦 我已经启用了变更集评论政策 这样他们甚至可以在签到时留下评论 否则他们不会 我们就团队的工作质量进行了一些讨论 他们很
  • 如何在内存中存储分子?

    我想将分子存储在内存中 这些可以是简单的分子 Methane CH4 C H bond length 108 7 pm H H angle 109 degrees But also more complex molecules like p
  • 在 ASP.NET 中将事件冒泡为父级

    我已经说过 ASP NET 中的层次结构 page user control 1 user control 2 control 3 我想要做的是 当控件 3 它可以是任何类型的控件 我一般都想这样做 让用户用它做一些触发回发的事情时 它会向
  • 窗体最大化时自动缩放子控件

    有没有办法在最大化屏幕或更改分辨率时使 Windows 窗体上的所有内容自动缩放 我发现手动缩放它是正确的 但是当切换分辨率时我每次都必须更改它 this AutoScaleDimensions new System Drawing Siz
  • 将变量分配给另一个变量,并将一个变量的更改反映到另一个变量中

    是否可以将一个变量分配给另一个变量 并且当您更改第二个变量时 更改会瀑布式下降到第一个变量 像这样 int a 0 int b a b 1 现在 b 和 a 都 1 我问这个问题的原因是因为我有 4 个要跟踪的对象 并且我使用名为 curr

随机推荐

  • 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