Tag: xml serialization

为自定义XmlSerializer生成Xml序列化程序集

我的类中有方法使用与使用默认序列化程序生成的XML结构不同的XML结构进行序列化/反序列化。 这些方法为我的类型创建了一个XmlSerializer,但是有一大堆覆盖。 当调用这些方法时,我猜.NET内部仍会生成序列化程序集,但我想在编译后生成此程序集,因此它不会在运行时生成。 如何为此自定义序列化生成序列化程序集? 如果我对该类型使用sgen.exe,它似乎只生成默认的序列化程序。 特别是我需要生成序列化程序集的原因是我的代码是从Internet Explorer进程中调用的,它在保护模式下运行。 如果.net运行时尝试生成序列化程序集,则会调用csc.exe并提示用户,询问是否允许运行此进程。 我不希望提示用户! 所以需要在没有csc.exe的情况下完成所有序列化/反序列化。 我能想到的一个选择是捕获在运行时生成的.cs,将它放在一个单独的程序集中,然后将其包含在我的产品中。 除了有点icky,这引发了如何自动生成.cs作为我的构建过程的一部分的问题… 也许值得一提的是:我的自定义xml序列化也序列化了嵌套类,因此也许会有自动生成的序列化器。 我的自定义序列化主要是按照以下几行完成的 – 它将XmlIgnore添加到某些属性中,并从其他属性中删除XmlIgnore。 其中许多属性返回需要序列化的对象,其中一些实现IXmlSerializable,一些使用默认序列化。 public void SerializeToCustomXml1(XmlWriter writer) { try { CustomXmlSerializer1.Serialize(writer, this); } catch (Exception) { } } /// /// Static serializer so it’s created just once. There’s another one like this CustomXmlSerializer2 with a slightly different format again. /// private […]

在.NET XML反序列化中,如何允许多态使用Array类型?

示例架构: … … 通过.NET运行此wsdl.exe会生成类似于以下内容的代码: [System.Xml.Serialization.XmlIncludeAttribute(typeof(Dog[]))] public partial class Dog { … } public partial class Cat { … } public partial class Foo { private string barField; private object bazField; } 似乎wsdl.exe试图“智能”并意识到我的ArrayOfDog实际上只是一个可以编码为C#数组的包装类型。 当在另一种数据类型中显式引用ArrayOfDog时,这可以正常工作。 但是,当多态地使用ArrayOfDog时(例如,作为xsd:anyType的替换),这会中断。 它似乎打破了,因为.NET运行时对名为“ArrayOfDog”的complexType一无所知 – 它基本上抛弃了这些信息,转而使用原生C#数组。 示例XML文档1: Hello … 示例XML文档2: Hello … … 文档#1由运行时正确反序列化。 我得到了一个类型为Foo的对象,其中包含Bar和Baz的正确反序列化字段。 文档#2被运行时错误地反序列化。 我得到一个类型为Foo的对象,其中有一个正确的反序列化字段用于Bar,但对于Baz字段,我得到System.XML.XMLNode []。 我的猜测是因为运行时对名为“ArrayOfDog”的实体的任何类型绑定都一无所知。 您可能认为XmlInclude指令“XmlIncludeAttribute(typeof(Dog []))”将处理此问题,但它似乎不起作用。 有人遇到过这个吗? 这里有优雅的解决方案吗? 我正在考虑使用的解决方法是将我的“ArrayOf”类型包装在另一种类型中,并将其包含在xsd:anyType的替换中。

如何(xml)序列化uri

我有一个我标记为Serializable的类,具有Uri属性。 如何在不创建string类型属性的情况下让Uri序列化/反序列化?

如何使用带有XDocument的构造函数将XML反序列化为对象?

我上课了: public class MyClass { public MyClass(){} } 我希望能够使用XMLSeralizer直接在构造函数中反序列化XDocument: public class MyClass { private XmlSerializer _s = new XmlSerializer(typeof(MyClass)); public MyClass(){} public MyClass(XDocument xd) { this = (MyClass)_s.Deserialize(xd.CreateReader()); } } 除了我不允许在构造函数中指定“this”。 这可能吗?

XML序列化,编码

using System; public class clsPerson { public string FirstName; public string MI; public string LastName; } class class1 { static void Main(string[] args) { clsPerson p=new clsPerson(); p.FirstName = “Jeff”; p.MI = “A”; p.LastName = “Price”; System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(p.GetType()); x.Serialize(Console.Out, p); Console.WriteLine(); Console.ReadLine(); } } 取自http://support.microsoft.com/kb/815813 1) System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(p.GetType()); 这条线做什么? […]

用于Xml Serilization的XmlRoot()不起作用

我正在尝试让我的httphandler打印出格式为的XML文件: … … … 但由于某种原因,ScheduledShow.cs中的属性XmlRoot(“ScheduledShowElement”)不能按我希望的方式工作。 相反,我得到的输出是: … … …<ScheduledShow 基本上,节点的名称没有被覆盖。 如何让我的xml序列化程序将节点标记为? 下面是我的代码和xml输出。 谢谢! OneDayScheduleHandler.cs using System; using System.Collections.Generic; using System.Web; using System.Xml.Serialization; using Microsoft.Practices.EnterpriseLibrary.Data; using System.Data.Common; using System.Data; using System.IO; using System.Xml; using System.Text; using CommunityServer.Scheduler; namespace CommunityServer.Scheduler { public class OneDayScheduleHandler : IHttpHandler { private readonly int NoLimitOnSize = -1; public void ProcessRequest(HttpContext context) […]

在C#中更改XmlSerializer生成的XML结构

我的课程如下 namespace Coverage { public class ClassInfo { public string ClassName; public int BlocksCovered; public int BlocksNotCovered; public ClassInfo() {} public ClassInfo(string ClassName, int BlocksCovered, int BlocksNotCovered) { this.ClassName = ClassName; this.BlocksCovered = BlocksCovered; this.BlocksNotCovered = BlocksNotCovered; } } public class Module { public List ClassInfoList; public int BlocksCovered; public int BlocksNotCovered; public string moduleName; […]

在集合对象上实现IXmlSerializable

我有一个看起来像这样的xml文件: value value value value 我有两个代表这个xml的对象: class XmlObject { public string A { get; set; } public string B { get; set; } List listitems { get; set; } } class Item : IXmlSerializable { public string C { get; set; } public string D { get; set; } //Implemented IXmlSerializeable read/write public void ReadXml(System.Xml.XmlReader […]

序列化没有xmlns

我有几个扩展方法来处理我的类的序列化,因为它可能是一个耗时的过程,它们每个类创建一次,并通过此方法分发。 public static XmlSerializer GetSerializerFor(Type typeOfT) { if (!serializers.ContainsKey(typeOfT)) { var xmlAttributes = new XmlAttributes(); var xmlAttributeOverrides = new XmlAttributeOverrides(); System.Diagnostics.Debug.WriteLine(string.Format(“XmlSerializerFactory.GetSerializerFor(typeof({0}));”, typeOfT)); xmlAttributes.Xmlns = false; xmlAttributeOverrides.Add(typeOfT, xmlAttributes); var newSerializer = new XmlSerializer(typeOfT, xmlAttributeOverrides); serializers.Add(typeOfT, newSerializer); } return serializers[typeOfT]; } 这是通过扩展方法调用的.Serialize() public static XElement Serialize(this object source) { try { var serializer = XmlSerializerFactory.GetSerializerFor(source.GetType()); var xdoc […]

如何将C#WCF DataContract序列化/反序列化到XML或从XML序列化

我正在开发一个WCF服务,它将由多个不同的客户端应用程序使用。 为了使一个function起作用,服务器需要将XML文件读入C#DataContract,然后将其传递给相关客户端。 据我所知,从MSDN网站,这是可能的,但我找不到任何完整的例子。 特别是,该网站谈到了一个“流”参数,我还没有完成。 我的数据协定有一个属性字段,它是另一个具有多个简单属性字段的数据协定的列表。 例如 [DataContract] public class MyClass1 { [DataMember] public string name; [DataMember] public int age; } [DataContract] public class MyClass2 { [DataMember] public List myClass1List; } 我的课看起来像这样。