Tag: xml serialization

如何将多个对象序列化为现有的XmlDocument,而不在每个组件上都有命名空间?

如何在.Net / C#中将多个对象序列化为现有的XmlDocument? 我有一个XmlDocument,它已经包含数据。 我有多个对象。 现在我想逐个序列化它们并将它们添加到XmlDocument(AppendChild)。 这应该是这样的: … anydata … anydata 当我使用XmlSerializer时,我得到每个组件的这个定义: anydata 所以这就是我得到的,当我序列化为一个字符串然后从字符串创建一个XmlNode时,我追加到我的文档: … anydata … anydata 我可以通过这样做删除命名空间: XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); ns.Add(“”, “”); StringWriter xout = new StringWriter(); x.Serialize(xout, data, ns); 但后来我在对象数组中的任何对象上获取名称空间。 这个对象: public class component_1 { object[] arr; } 将被序列化为: one two 是否可以将所有需要的命名空间等添加到我的文档中,然后将对象序列化为XmlNodes并将它们添加到我的文档中,而不是在每个组件上都有命名空间? 更新:函数test()将序列化两个对象并将它们附加到文档。 最后一行将反序列化第一个对象。 using System; using System.IO; using System.Text; […]

使用XmlSerializer序列化ArrayList

我正在视觉工作室2010上进行一个小型的c#项目,并且正在尝试序列化一个具有People类对象的arraylist。 这是我的代码块 FileStream fs = new FileStream(“fs.xml”, FileMode.OpenOrCreate, FileAccess.Write); XmlSerializer xml = new XmlSerializer(typeof(ArrayList)); xml.Serialize(fs,this.array); 我在最后一行有一条错误消息“生成XML文档时出错”。 有人可以帮我放好吗?

C#自定义Xml序列化

我试图通过XmlSerializer反序列化一个自定义类并遇到一些问题,事实上我不知道我将要反序列化的类型(它是可插入的)并且我很难确定它。 我发现这篇文章看起来很相似,但不能完全使用我的方法,因为我需要反序列化一个XmlSerializable的接口。 我目前得到的是forms。 请注意,我希望并且需要能够处理通过插件实现的A类和B类。 所以,如果我可以避免使用IXmlSerializable(我认为我不能),那就太棒了。 用于A的ReadXml是我坚持的。 但是,如果我可以进行其他改进以改进系统,那么我很乐意这样做。 public class A : IXmlSerializable { public IB MyB { get; set;} public void ReadXml(System.Xml.XmlReader reader) { // deserialize other member attributes SeekElement(reader, “MyB”); string typeName = reader.GetAttribute(“Type”); // Somehow need to the type based on the typename. From potentially //an external assembly. Is it possible to use […]

InvalidOperationException:参数对象’Scratch’的类型不是原始的

所以有错误。 InvalidOperationException:参数对象’Scratch’的类型不是原始的 我正在做的是序列化类List ( List )。 BaseEnemy类还有一个类List ( List )。 当我运行时,BaseEnemy列表正确序列化。 但是,BaseMoves列表没有。 Scratch是一个派生自BaseMove的类,它存储在List 。 这就是我遇到的问题。 我在这里找到了答案…… 这里 …… “使用XmlInclude属性标记BaseMove类,将派生类作为参数传递:” [XmlInclude(typeof(Scratch))] public class BaseMove { public BaseMove() { } } 奇迹般有效! 那我为什么要在这里发帖呢? 新问题。 我有大量来自BaseMove的动作。 有没有快捷方式,还是我必须在XmlInclude中编写每一个“typeof(…)”? 编辑 – 我找到的另一种解决方案。 public static Type[] GetAllSubTypes(Type aBaseClass) { List result = new List(); Assembly[] assemblies = System.AppDomain.CurrentDomain.GetAssemblies(); foreach (Assembly a […]

自定义DateTime XML序列化

我希望能够使用不是服务器的特定时区序列化DateTime,也不是客户端时间。 基本上,任何时区。 是否可以在.Net2.0 webservices中覆盖DateTime序列化? 我使用xsd.exe编译xmlschema,所以我尝试使用XmlSchemaImporter。 OnSerialize示例显示值更改,但不更改输出格式。 XmlSchemaImporter,将其加载到gac中,运行xsd.exe,并生成具有我想要的类的代码……但该类是一个属性,最终无法反映。 [InvalidOperationException:无法序列化类型为Cuahsi.XmlOverrides.W3CDateTime的成员’metadataDateTime’。 XmlAttribute / XmlText不能用于编码复杂类型。] 生成的代码 [System.Xml.Serialization.XmlAttributeAttribute()] public Cuahsi.XmlOverrides.W3CDateTime dateTime { get { return this.dateTimeField; } set { this.dateTimeField = value; } } XmlSchemaImporter public class ImportW3CTime : System.Xml.Serialization.Advanced.SchemaImporterExtension { public override string ImportSchemaType(string name, string ns, XmlSchemaObject context, XmlSchemas schemas, XmlSchemaImporter importer, CodeCompileUnit compileUnit, CodeNamespace mainNamespace, CodeGenerationOptions options, […]

使用.NET XmlSerializer进行反序列化时,请使用多个名称空间

我正在尝试使用两个名称空间反序列化XML,就像这样 有时是旧版本 我的Records.cs类有 [XmlRoot(ElementName = “records”, Namespace = “http://www.foo.com/xml/records/1.1”)] public class Records { [System.Xml.Serialization.XmlElementAttribute(“record”)] public List Records { get; set; } } 我希望记录列表能够包含版本1.0或版本1.1记录 /// [XmlRoot(IsNullable = false, ElementName = “record”, Namespace = “http://www.foo.com/xml/record/1.0”)] public partial class Record { /// public Record() { } } /// [XmlRoot(IsNullable = false, ElementName = “record”, Namespace = “http://www.foo.com/xml/record/1.1”)] public […]

如何告诉XmlSerializer始终使用序列化属性?

我正在使用DefaultValue属性来获取正确的PropertyGrid行为(它以粗体显示与默认值不同的值)。 现在,如果我想使用XmlSerializer序列化显示的对象,则xml-file中将没有具有默认值的属性的条目。 告诉XmlSerializer序列化这些仍然是最简单的方法是什么? 我需要它来支持“版本”,所以当我稍后在代码中更改默认值时 – serialized属性获取它已序列化的值,而不是“最新”的值。 我可以考虑以下事项: 覆盖PropertyGrid行为(使用自定义属性,因此它将被XmlSerializer忽略); 做一些自定义的xml-serialization,忽略DefaultValue ; 在将对象传递给XmlSeriazer之前对其执行某些操作,以便它不再包含DefaultValue 。 但是我有可能错过了一些秘密财产,它可以做到这一点而没有太大的痛苦= D. 这是我想要的一个例子: private bool _allowNegative = false; /// /// Get or set if negative results are allowed /// [Category(CategoryAnalyse)] [Admin] [TypeConverter(typeof(ConverterBoolOnOff))] //[DefaultValue(false)] *1 public bool AllowNegative { get { return _allowNegative; } set { _allowNegative = value; ConfigBase.OnConfigChanged(); } } //public void […]

在字符串属性的xml序列化中缩进文本?

我有一个字符串属性,其中包含带换行符的文本。 此文本具有HTML文本的一些属性,因为空格被忽略。 如果我使用XML序列化序列化此类型,则新行被正确序列化,但缩进是“错误的”。 我希望序列化过程缩进行以保持XML的格式,因为无论如何这些空白字符将被忽略。 这是LINQPad程序的示例: void Main() { var d = new Dummy(); d.Text = @”Line 1 Line 2 Line 3″; var serializer = new XmlSerializer(typeof(Dummy)); var ns = new XmlSerializerNamespaces(); ns.Add(“”, “”); using (var writer = new StringWriter()) { serializer.Serialize(writer, d, ns); writer.ToString().Dump(); } } [XmlType(“dummy”)] public class Dummy { [XmlElement(“text”)] public string Text […]

将嵌套的xml反序列化为C#对象

我正在从http Web请求中检索xml数据并将数据反序列化为对象。 这是一个示例xml结构。 … … … … … 我有四节课 public class Users { [XmlElement(“user”)] public User[] UserList { get; set; } } public class User { [XmlElement(“name”)] public string Name { get; set; } [XmlArray(“orders”)] public Orders OrderList { get; set; } } public class Orders { [XmlElement(“order”)] public Order[] Order { get; set; } […]

有没有办法让XmlSerializer以定义的顺序输出xml?

目前我正在使用XmlSerializer来序列化和反序列化一个对象。 xml以未定义的顺序生成,这是可以理解的,但在比较对象的版本时会使其烦人,因为每次属性的顺序都不同。 因此,例如我不能使用普通的差异工具来查看任何差异。 有没有一种简单的方法可以每次以相同的顺序生成我的xml,而无需自己编写ReadXml和WriteXml方法? 我在类上有很多属性,并且不时地添加新的属性,所以宁愿不必编写然后维护该代码。 (C#.net 2.0)