此标记指的是使用XML作为数据格式的序列化技术。
我正在 VB.net 中设计一些复杂的类(但如果您愿意,可以用 C# 编写答案:P),其中包含必须从 XML 加载的数据。当然,显而易见的解决方案是设计一个
使用DataContractSerializer进行序列化,但无法反序列化回来
我有以下2个功能: 公共静态字符串序列化(对象obj) { DataContractSerializer 序列化器 = new DataContractSerializer(obj.GetType()); 内存流 内存流 = 新
如何在 C# 中仅从 DateTime 序列化 Xml Date
我有以下简单的课程; 生日 { 公共 DateTime 出生日期 {get;set;} 公共字符串名称 {get;set;} } 然后我使用以下命令将对象序列化为 Xml: 尝试 { XmlSerializer 序列化器 =...
我有一个像这样的课程 [可序列化] 公开课我的班级 { [Xml属性] 公共布尔 myBool { 得到;放; } } 但这会在以下情况下将 bool 值序列化为 false...
我正在使用 boost ( 1.69.0 ) 序列化来生成 XML 模板文件。 不幸的是我想要达到的结果很糟糕。 这是示例代码: 结构A { 结构B { int bInt;...
C# XmlSerializer - 输出控制新行的多个 xml 片段
我希望能够编写没有命名空间、没有 XML 前导码等的 xml 片段。 XmlSerializer.Serialize() 在序列化为通用输出流时会产生缩进输出,但它使用 &qu...
MyAssembly.XmlSerializers.dll 生成的目的是什么?
我正在开发一个生成程序集的项目。我刚刚注意到正在生成一个附加程序集 *.XmlSerializers.dll。为什么会自动生成这个文件以及它的用途是什么?
XmlSerializer 跳过非漂亮格式 xml 中的项目
如果我的 xml 文件格式不美观: 某名1某名2 如果我的 xml 文件格式不美观: <ArrayOfColumn><Column><COLUMN_NAME>SomeName1</COLUMN_NAME></Column><Column><COLUMN_NAME>SomeName2</COLUMN_NAME></Column></ArrayOfColumn> 此代码跳过第二列(如果有两个以上,则跳过第二列): using (var xmlReader = XmlReader.Create(fileStream)) { var serializer = new XmlSerializer(typeof(MyColumnClass), new XmlRootAttribute("Column")); var myColumnClass= new List<MyColumnClass>(); while (xmlReader.ReadToFollowing("Column")) { list.AddRange(new List<MyColumnClass>() { (MyColumnClass)serializer.Deserialize(xmlReader) }); // rest of code } 虽然我的 xml 格式很漂亮,但它运行得很好: <ArrayOfColumn> <Column> <COLUMN_NAME>SomeName1</COLUMN_NAME> </Column> <Column> <COLUMN_NAME>SomeName2</COLUMN_NAME> </Column> </ArrayOfColumn> 如何调整代码以支持非漂亮的 xml 格式? 问题不太好。当您阅读下一个元素时,您已经处于下一个元素并跳过所有其他元素。尝试以下我多年来一直使用的方法 while (!xmlReader.EOF) { if(xmlReader.Name != "Column") { xmlReader.ReadToFollowing("Column"); } if (!xmlReader.EOF) { list.AddRange(new List<MyColumnClass>() { (MyColumnClass)serializer.Deserialize(xmlReader) }); // rest of code } }
我有一个简单的 C#9 位置记录,带有一个空构造函数(除了主构造函数之外): 公共记录 FiscalTag(int Code, string Value, List ChildTags) { 公共财政标签():
在序列化为XML文件的过程中,我遇到了无限循环问题。我正在使用 java.beans,并通过 XMLEncoder,我尝试序列化三个类:Category、Contact 和 E...
如何从Entity框架生成Poco模型,该模型可用于将对象实例持久化到xml?基本上我想知道 T4 模板是什么样的?
在 C# 中使用混合元素顺序反序列化/序列化 XML 时出现问题
我在将 XML 反序列化/序列化为 C# 对象时遇到问题。 XML 结构具有混合的元素顺序,我遇到了具有相同名称但
如何使用 XmlSerializer 指定 XmlAttributes 的顺序
XmlElement 有一个“Order”属性,在使用 XmlSerializer 进行序列化时,您可以使用该属性指定属性的精确顺序(无论如何都相互关联)。 公开课预约L...
XmlSerializer 在 XML 文件中具有属性和前缀
我可以使用 XmlSerializer 从 C# 类获取此 XML 文件。 <
“类型不是预期的”,使用 DataContractSerializer - 但这只是一个简单的类,没有有趣的东西?
我正在重构我的 XML 序列化,并想尝试一下 DataContractSerializer。 一切都运行顺利,直到需要序列化此类: 使用系统; 使用 System.Runtime.Serializa...
在 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>
我正在尝试反序列化从服务获取的 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 您的数据符合命名空间要求,这一点很重要。
我有以下课程: 公共接口 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); } } }