xml-serialization 相关问题

此标记指的是使用XML作为数据格式的序列化技术。

“类型不是预期的”,使用 DataContractSerializer - 但这只是一个简单的类,没有有趣的东西?

我正在重构我的 XML 序列化,并想尝试一下 DataContractSerializer。 一切都运行顺利,直到需要序列化此类: 使用系统; 使用 System.Runtime.Serializa...

回答 7 投票 0

在 C# 中反序列化时出现 InvalidOperationException

我正在使用基于 XML 的 .config 文件来存储一些记录。我的 XML 如下: 我正在使用基于 XML 的 .config 文件来存储一些记录。我的 XML 如下: <?xml version="1.0" encoding="utf-8"?> <Data_List xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <Configuration> <Name>1st Week</Name> <Binary> <Field>field1</Field> <Version>1.0</Version> </Binary> <Binary> <Field>field2</Field> <Version>2.0</Version> </Binary> </Configuration> <Configuration> <Name>2nd Week</Name> <Binary> <Field>field1</Field> <Version>2.0</Version> </Binary> <Binary> <Field>field2</Field> <Version>4.0</Version> </Binary> </Configuration> </Data_List> 我使用 C# 代码如下: public Binary { public String Field; public String Version; } public Configuration { public String Name; public List<Binary> Binary_List = new List<Binary>(); public GetfromXML() { List<Configuration> lists = new List<Configuration>(); TextReader reader = new StreamReader("Data_List.config"); XmlSerializer serializer = new XmlSerializer(typeof(List<Configuration>)); lists=(List<Configuration>)serializer.Deserialize(reader); reader.Close(); } 我收到异常消息“XML 文档(2,2) 中存在错误”。我该如何解决它? 我认为问题在于你的模型结构不佳。换句话说,序列化程序不知道如何读取您的 .xml。 您的 xml 错误。当你有 List< T > 时,会有一个: <ArrayOfT></ArrayOfT> 在 .XML 中。这是你需要做的! 首先,尝试使用 System.Xml.Serialization 中的 xml 属性(即 [XmlArray()]) 最好使用 FileStream 而不是仅仅指出 URI using(var filestream = new FileStream(//your uri, FIleMode.Open) { } 使用属性而不是变量。因为稍后您可能想要绑定。 我如何设法解决该问题的代码示例: public ServiceMap Deserialize() { ServiceMap serviceMap = new ServiceMap(); try { using (var fileStream = new FileStream(Settings.ServiceMapPath, FileMode.Open)) { XmlReaderSettings settings = new XmlReaderSettings(); settings.IgnoreComments = true; using (XmlReader reader = XmlReader.Create(fileStream, settings)) { serviceMap = _serializer.Deserialize(reader) as ServiceMap; } } } catch (FileNotFoundException) { MessageBox.Show("File 'ServiceMap.xml' could not be found!"); } return serviceMap; } 我的 ServiceMap 类: [XmlRoot("ServiceMap")] public class ServiceMap { [XmlArray("Nodes")] [XmlArrayItem("Node")] public List<Node> Nodes = new List<Node>(); [XmlArray("Groups")] [XmlArrayItem("Group")] public List<Group> Groups = new List<Group>(); [XmlArray("Categories")] [XmlArrayItem("Category")] public List<Category> Categories = new List<Category>(); } 编辑:我的XML: <?xml version="1.0" encoding="utf-8"?> <ServiceMap xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http:// www.w3.org/2001/XMLSchema"> <Nodes> <Node Name="Predrag"> <Children> <Child>dijete1</Child> <Child>dijete2</Child> <Child>dijete3</Child> <Child>dijete4</Child> </Children> <Parents> <Parent>roditelj1</Parent> <Parent>roditelj2</Parent> <Parent>roditelj3</Parent> </Parents> <Group Name="Grupa" /> <Category Name="Kategorija" /> </Node> <Node Name="Tami"> <Children> <Child>dijete1</Child> <Child>dijete2</Child> </Children> <Parents> <Parent>roditelj1</Parent> </Parents> <Group Name="Grupa2" /> <Category Name="Kategorija2" /> </Node>

回答 1 投票 0

XmlSerializer遇到xml属性时崩溃

我正在尝试反序列化从服务获取的 XML。 但 XmlSerializer 在遇到第一个属性时会失败。 我的缩短的 xml 如下所示: 我正在尝试反序列化从服务获取的 XML。 但是 XmlSerializer 在遇到第一个属性时失败。 我的缩短的 xml 如下所示: <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <ns2:basicInformation xmlns:ns2="http://fu.bar.com/"> <somenode>...</somenode> ... </ns2:basicInformation> 我的班级是这样的 [XmlRoot(ElementName = "basicInformation")] public class BasicInformation { [XmlElement(ElementName = "somenode")] public string SomeNode { get; set; } ... [XmlAttribute(AttributeName = "ns2")] public string Ns2 { get; set; } [XmlText] public string Text { get; set; } } 我得到的错误是这样的: "There is an error in XML document (1, 57)."} Data: {System.Collections.ListDictionaryInternal} HResult: -2146233079 HelpLink: null InnerException: {"<basicInformation xmlns='http://message.async.dms.svap.deere.com/'> was not expected."} Message: "There is an error in XML document (1, 57)." Source: "System.Xml" StackTrace: " at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)\r\n at System.Xml.Serialization.XmlSerializer.Deserialize(TextReader textReader)\r\n at AzureQueue.Program.Blurg() in E:\\_Code_\\Testing\\AzureQueue\\AzureQueue\\Program.cs:line 432\r\n at AzureQueue.Program.<DoSomething>d__1.MoveNext() in E:\\_Code_\\Testing\\AzureQueue\\AzureQueue\\Program.cs:line 71" TargetSite: {System.Object Deserialize(System.Xml.XmlReader, System.String, System.Xml.Serialization.XmlDeserializationEvents)} 如果我将 xaml 中的第二行替换为: <ns2:basicInformation xmlns:ns2="http://fu.bar.com/"> 对此: <basicInformation> 一切都很好。 所以这是具有该属性的东西,我没有正确处理,但我一直无法找到解决方案。 我应该提到,C# 类是从 xml 到 c# 工具生成的,因为完整的 xml 很大。 那么我错过了什么?我可以用非常丑陋的方式解决这个问题并进行字符串替换,但这感觉非常错误! ;) [XmlRoot(ElementName = "basicInformation", Namespace = "http://fu.bar.com/")] public class BasicInformation 您的数据符合命名空间要求,这一点很重要。

回答 1 投票 0

为什么我的 XML 反序列化仅识别第一个包含的对象标签

我有以下课程: 公共接口 IVariable { 字符串名称 { 获取; } 动态值{获取;放; } } 公共类命名空间:IVariable、IXmlSerialized、IEnumerable 我有以下课程: public interface IVariable { string Name { get; } dynamic Value { get; set; } } public class Namespace : IVariable, IXmlSerializable, IEnumerable<IVariable> { protected Namespace() { } public Namespace(string name, params string[] aliases) { this.Name = name; this._aliases.AddRange(aliases); } private readonly List<IVariable> _variables = new List<IVariable>(); public string Name { get; private set; } dynamic IVariable.Value { get => this; set => throw new InvalidOperationException(); } private readonly List<string> _aliases = new List<string>(); public void Add(IVariable variable) { _variables.Add(variable); } public dynamic this[string key] { get { foreach (var variable in _variables) { if (variable.Name == key) return variable.Value; if (variable is Namespace ns && ns._aliases.Contains(key)) return ns; } return null; } set { foreach (var variable in _variables) { if (variable.Name == key) variable.Value = value; if (variable is Namespace ns && ns._aliases.Contains(key)) throw new InvalidOperationException(); } } } void IXmlSerializable.WriteXml(XmlWriter writer) { writer.WriteAttributeString("name", Name); foreach (var alias in _aliases) { writer.WriteElementString("Alias", alias); } foreach (var variable in _variables) { if (variable is Variable v) { writer.WriteStartElement("Variable"); writer.WriteAttributeString("name", v.Name); writer.WriteAttributeString("typecode", v.TypeCode.ToString()); writer.WriteString(v.Value.ToString()); writer.WriteEndElement(); } else { var serializer = new XmlSerializer(typeof(Namespace)); serializer.Serialize(writer, (Namespace)variable); } } } XmlSchema IXmlSerializable.GetSchema() { return null; } void IXmlSerializable.ReadXml(XmlReader reader) { Name = reader.GetAttribute("name"); var aliases = new List<string>(); while (true) { reader.Read(); if (reader.Name != "Alias") break; reader.Read(); _aliases.Add(reader.Value); reader.Read(); } while (true) { if (reader.Name == "Variable") { var name = reader.GetAttribute("name"); var typecode = (TypeCode)Enum.Parse(typeof(TypeCode), reader.GetAttribute("typecode")); reader.Read(); var variable = new Variable(typecode, name); variable.SetValueFromString(reader.Value); Add(variable); } else if (reader.Name == "Namespace") { var serializer = new XmlSerializer(typeof(Namespace)); _variables.Add((Namespace)serializer.Deserialize(reader)); } else { break; } } } public IEnumerator<IVariable> GetEnumerator() { return ((IEnumerable<IVariable>)_variables).GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return ((IEnumerable)_variables).GetEnumerator(); } } 命名空间可以包含变量或其他命名空间,变量可以保存Sysetem.TypeCode中定义的多种类型之一,并且我需要能够保存整个嵌套结构。 WriteXml 方法按预期工作: void Main() { var stream = new MemoryStream(); var serializer = new XmlSerializer(typeof(Namespace)); var ns = new Namespace("foo", "f") { new Variable(TypeCode.String, "bar", "baz"), new Namespace("qux") { new Variable(TypeCode.Int32, "quxx", 42) }, }; serializer.Serialize(stream, ns); stream.Position = 0; Console.Out.WriteLine(new StreamReader(stream).ReadToEnd()); } 此代码产生以下输出: <?xml version="1.0" encoding="utf-8"?> <Namespace name="foo"> <Alias>f</Alias> <Variable name="bar" typecode="String">baz</Variable> <Namespace name="qux"> <Variable name="quxx" typecode="Int32">42</Variable> </Namespace> </Namespace> 这似乎是正确的,但是当我使用解串器时, stream.Position = 0; var ns2 = (Namespace)serializer.Deserialize(stream); foreach (IVariable variable in ns2) { Console.Out.WriteLine(variable.Name); } 我只得到第一个成员,bar。如果我交换定义中变量和命名空间的顺序,我会得到命名空间的名称,但不会得到变量。 我做错了什么?我尝试在 reader.Read() 循环体之前和之后添加 while 调用,这只会导致解串器认为 XML 已损坏。 有趣的是,我可以添加任意数量的 <Alias> 标签,而不会破坏任何内容。 正如 @jdweng 在评论中所建议的,我通过使用 XML Linq 找到了一个可行的解决方案。 我重写了ReadXml方法如下: void IXmlSerializable.ReadXml(XmlReader reader) { if (!reader.IsStartElement()) return; Name = reader.GetAttribute("name"); var element = (XElement)XElement.ReadFrom(reader); foreach (var e in element.Elements().Cast<XElement>()) { if (e.Name == "Alias") { _aliases.Add(e.Value); } else if (e.Name == "Variable") { var name = e.Attribute(XName.Get("name")).Value; var type = (TypeCode)Enum.Parse(typeof(TypeCode), e.Attribute(XName.Get("typecode")).Value); var valueStr = e.Value; var variable = new Variable(type, name); variable.SetValueFromString(valueStr); Add(variable); } else if (e.Name == "Namespace") { var ns = (Namespace)new XmlSerializer(typeof(Namespace)).Deserialize(e.CreateReader()); Add(ns); } } }

回答 1 投票 0

如何序列化/反序列化派生类的 unordered_map 成员

所以我正在用 C++ 构建一个模拟文件系统,以更好地研究该语言,也许还可以进行一些系统级编程。我使用 Boost::Serialization 来保存文件系统的状态,当用户...

回答 1 投票 0

使用XmlSerializer序列化派生类

我正在使用 XmlSerializer 序列化包含通用列表的对象 列表 子项 {get;set} 问题是每个元素都派生自 ChildBase,它实际上是一个ABS...

回答 3 投票 0

C# XML 序列化:序列化可空值类型(想要在没有装饰器/属性/ShouldSerialize 的情况下抑制“空”值)

我正在使用 C# 代码尝试将对象序列化为 XML。我无法向此对象添加 XML 属性或额外属性(例如 bool ShouldSerializeFoo)。我也无法向

回答 1 投票 0

XML 文档中有错误 (1, 41)

当我对 xml 进行反序列化时,我收到“XML 文档 (1, 41) 中存在错误”。 。谁能告诉我问题到底是什么。 公共静态 T DeserializeFromXml 当我对 xml 进行反序列化时,我收到“XML 文档中存在错误 (1, 41)”。 。谁能告诉我问题到底是什么。 public static T DeserializeFromXml<T>(string xml) { T result; XmlSerializer ser = new XmlSerializer(typeof(T)); using (TextReader tr = new StringReader(xml)) { result = (T)ser.Deserialize(tr); } return result; } 我就是用这个函数来做的。 <?xml version='1.0' encoding='utf-16'?> <Message> <FirstName>Hunt</FirstName> <LastName>DAvid</LastName> </Message> 确保您的消息类如下所示: [Serializable, XmlRoot("Message")] public class Message { public string FirstName { get; set; } public string LastName { get; set; } } 这对我来说很好: string xml = File.ReadAllText("c:\\Message.xml"); var result = DeserializeFromXml<Message>(xml); MSDN,XmlRoot.ElementName: 生成并识别的 XML 根元素的名称 XML 文档实例。 默认是序列化的名称 班级. 因此,您的类名可能不是 Message,这就是解串器无法使用默认行为找到它的原因。 同意 sll 的答案,但遇到了另一个障碍,即在属性中指定了名称空间,当收到返回 xml 时,未包含名称空间,因此无法找到该类。 我必须找到一种解决方法来指定属性中的命名空间,并且它起作用了。 即。 [Serializable()] [XmlRoot("Patient", Namespace = "http://www.xxxx.org/TargetNamespace")] public class Patient 生成 <Patient xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.xxxx.org/TargetNamespace"> 但我不得不将其更改为 [Serializable()] [XmlRoot("Patient")] public class Patient 生成为 <Patient xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 这解决了我的问题,希望对其他人有帮助。 首先检查使用正确数据类型声明的变量。 我遇到了同样的问题,然后我检查了,错误地我将 SAPUser 声明为 int 数据类型,从而发生了错误。 还有一件事 XML 文件使用数组之类的概念存储其数据,但其第一个索引开始为 +1。 例如如果错误在(7,2) 则 始终检查第六行...... 我也有同样的事情。所有这些都归结为模式中标签名称中的“d”而不是“D”。 在我的例子中,我需要一个 float 值,其中 xml 具有 null 值,因此请务必在 xsd 映射中搜索 float 和 int 数据类型 在我正在从事的 WEC7 项目中,我遇到了类似的错误。我序列化的文件是从对象数组序列化出来的,所以我认为 XML 没问题。另外,我在之前的几门课程中都曾遇到过这个问题,所以这是一个相当大的谜题。 然后我在之前的工作中注意到,我序列化/反序列化的每个类都有一个默认构造函数。我失败的案例中缺少这个,所以我添加了它,瞧……它工作得很好。 我似乎记得在某处读过这是必需的。我想是的。 我试图将十进制反序列化为浮点数,这引发了异常。始终尝试研究内部异常,因为这是通用异常。内部异常将为您提供问题的确切原因。快乐编码。

回答 7 投票 0

如何使用 XmlSerializer 将字符串序列化为 CDATA?

是否可以通过某种属性使用 .Net XmlSerializer 将字符串序列化为 CDATA?

回答 9 投票 0

使用maven自动生成jaxb.index文件

我有一个包,里面有多个java类。 我需要读取带有包的类数据的 xml 文件。 有没有一种自动方法(使用maven)来生成ObjectFactory类或jaxb...

回答 3 投票 0

如何使用 C# 将 24 小时时间序列化到 XML 或从 XML 序列化?

我知道如何使用 C# 将“日期”序列化为 XML 或从 XML 序列化: [XmlElement(数据类型=“日期”)] 公共 DateTime LastInvited { get => _LastInvited;设置 => _LastInvited = 值; } p...

回答 0 投票 0

无法在 Mono 中使用 System.XML,即使“关于”对话框显示它已加载

我已经绝望了;我正在尝试将 XML 序列化与 Mono 中的一些普通类一起使用。 [DataContract] 和 [DataMember] 无法解析,并且使用 System.XML 是不可能的;这不是我...

回答 2 投票 0

XML 文档错误 (2,2)

我有一些 xml 文件,我正在尝试在给定代码中按以下方式反序列化。 使用 (StreamReader srFileContent = new StreamReader(filePath)) { XmlSerializer 序列化器 = new XmlSerializer(

回答 4 投票 0

当我的 XML 属性为数字时 CanDeserialize 出错

我有一个反序列化一些 XML 的方法,当 XML 上的所有属性都是字符串时,它可以正常工作,但在这种情况下,我们有这个 XML: 方法

回答 0 投票 0

C# - 序列化为 XML 信息,关于绑定委托的函数

我需要能够保存一个委托,其中包含它连接到哪个函数的信息。是这样的: 在 C# 中: 公开课技能 { [XmlAttribute("技能函数")] 普...

回答 1 投票 0

如何处理xsdata库中的CDATA标签?

我正在致力于创建与 Finn API 对话的服务,它需要 XML 而不是 JSON。 基于 *.dtd 文件和 xsdata 库,我生成了允许我构建请求对象的类......

回答 0 投票 0

IXmlSerializable 结构在 Deserialize() 上抛出 InvalidProgramException

我有一个非常简单的控制台应用程序。忽略遗漏的检查,程序如下: 使用系统绘图; 使用 System.Xml; 使用 System.Xml.Schema; 使用 System.Xml.Serialization; 测试...

回答 0 投票 0

在 C# 中使用命名空间通配符反序列化 XML

我正在尝试反序列化名称空间每年都在变化的文档。我要反序列化的那个是去年的,但是我有一个不同的从那一年生成的模式

回答 0 投票 0

导出到 XML,包括嵌入式类

我有一个对象配置,它有一些属性。我可以导出它,但是,它还有一个 ArrayList,它与嵌入类相关,当我导出到 XML 时,我无法显示这些类。任何宝...

回答 2 投票 0

使用 SOAP 信封和无效的 xsd 地址反序列化 XML 文件

我想反序列化这种具有 SOAP 信封和标头中不再存在的无效 .xsd 地址的 XML 文件(finvoiceack.xsd)。想要将节点获取到数据集或我...

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.