Tag: datacontractserializer

强制ASMX代理使用XmlSerializer而不是DataContractSerializer

我们获得了我们必须在项目中使用的外部SOAP服务。 所有这些都提供了WSDL数据,但其中很多都不是.NET服务(大多数都是用Java编写的)。 我们使用wsdl.exe工具生成了许多客户端代理。 这个工具做它应该做的事情,它创建代理供我们使用。 一旦我们尝试使用生成的代理调用这些服务上的方法,就会出现问题。 我们拦截所有SOAP请求以进行日志记录,XML数据看起来与WSDL模式中指定的不同。 例如,如果一个字段被称为“名称”,我们的代理将序列化为“nameField”。 我想这是因为名为“Name”的属性使用名为“nameField”的支持字段。 另一方面的服务显然无法解释这种命名约定。 如果我们的ASMX代理使用旧的XmlSerializer,这将不会发生,但由于某种原因,他们选择DataContractSerializer,这完全扰乱了序列化并破坏了客户端和服务之间的兼容性。 我的同事们已经使用手动构建XML数据,然后使用HttpWebRequest类发送它。 我认为这在2011年是完全不可接受的,这就是自动代理生成的目的。 我的问题是:为什么会发生这种情况? 为什么我们的代理使用DataContractSerializer,从而忽略了进程中的所有xml序列化属性? 有没有办法强迫他们再次使用XmlSerializer? 我们使用.NET 4.0。

如何在.NET中自定义JSON枚举的反序列化?

我有以下示例C#代码,使用svcutils.exe应用程序从xsd自动生成。 [DataContract] public enum Foo { [EnumMember(Value = “bar”)] Bar = 1, [EnumMember(Value = “baz”)] Baz = 2 } [DataContract] public class UNameIt { [DataMember(Name = “id”)] public long Id { get; private set; } [DataMember(Name = “name”)] public string Name { get; private set; } [DataMember(Name = “foo”)] public Foo Foo { get; private […]

有没有办法覆盖DataContractJsonSerializer如何序列化日期?

有没有办法改变DataContractJsonSerializer序列化日期的方式? 目前,它会将日期转换为: { “date”: “/Date(1260597600000-0600)/” } 我宁愿让它序列化为自1970年以来的毫秒。这样,其他语言可以很容易地使用json数据。

为什么DataContractSerializer按字母顺序排序XML?

我有以下数据合同: namespace Wcf.Contracts.Data { [DataContract] public class Presence { [DataMember] public int Id { get; set; } [DataMember] public DateTime? From { get; set; } [DataMember] public DateTime? To { get; set; } [DataMember] public TimeSpan? BreakPeriod { get; set; } } } 将Presence实例序列化为XML并将相同的XML反序列化为Presence实例效果很好。 但反序列化表示序列化Presence对象的字符串变量给了我奇怪的行为。 某些属性获取默认值而不是XML中的指定值。 我发现XML中代表Presence属性的元素必须按字母顺序排列。 例如,在这段代码中 var dcs = new System.Runtime.Serialization.DataContractSerializer(typeof(Wcf.Contracts.Data.Presence)); var xml1 […]

树结构的序列化/ Derialization

我试图找出保存(序列化)和以后打开(反序列化)树结构的最佳方法。 我的结构由具有不同属性的各种对象类型组成,但每个都inheritance自基本抽象“Node”类。 每个节点都有唯一的ID(GUID),并且有一个AddSuperNode(Node nd)方法,用于设置节点的父节点。 这反过来调用其他方法,允许父节点知道它有哪些子节点。 但是,某些节点还使用AddAuxSuperNode()方法向节点添加辅助父节点。 我正在使用二进制序列化,但现在我想我想使用一些我有更多控制的东西,并且序列化数据更容易访问。 我还希望在反序列化时保留Type信息,并能够序列化私有值。 所以DataContractSerializer似乎是最好的方式。 我不能直接序列化根节点,因为节点有多个父节点。 我不想创建重复的对象。 所以我似乎需要将树解构为一个平面列表,然后将其序列化。 然后在序列化该列表后重建树。 这听起来不错吗? 就像我在每个节点都有一个唯一的GUID标识符之前所说的那样,但是现在节点直接引用它们的父节点/子节点并且不存储它们的id。 我可以更新AddSuperNode()和AddAuxSuperNode()方法,以便除了直接引用之外还更新要序列化的父ID列表。 但是我宁愿只在序列化对象时更新/创建这个列表。 所以我想在节点中创建一个UpdateSuperNodeIDRefs()方法,该方法将在序列化之前调用。 以下是我计划对此结构进行序列化和反序列化的操作。 任何人都可以建议更好/更清洁/更有效的方法吗? 序列化 1)提供树结构的根节点 2)将树结构分解为平面词典(Guid id,Node nd) ,其中id是nd的guid 。 3)调用UpdateSuperNodeIDRefs() ; 为每个节点更新为其父节点保存的ID。 4)使用DataContractSerializer序列化节点字典 反序列化 1)反序列化节点字典 2)遍历字典中的每个节点 ,将每个节点重新连接到其父节点 。 对于存储的任何父ID,查找具有匹配ID的字典中的相应节点调用AddSuperNode()或AddAuxSuperNode()以将节点重新连接到其父节点。 3)从Dictionary中的任何节点找到结构的根 4)返回根节点

DataContract模型绑定到ASP.NET MVC操作方法参数中的JSON

MVC3开箱即用JsonValueProviderFactory(),它非常方便将传入的JSON绑定到模型。 不幸的是,我无法弄清楚如何设置名称与传入JSON不同的模型合同。 例如: [DataContract(Name = “session”)] public class FacebookSession { [DataMember(Name = “access_token”)] public string AccessToken { get; set; } [DataMember(Name = “expires”)] public int? Expires { get; set; } [DataMember(Name = “secret”)] public string Secret { get; set; } [DataMember(Name = “session_key”)] public string Sessionkey { get; set; } [DataMember(Name = “sig”)] public string […]

RuntimeType:http://schemas.datacontract.org/2004/07/System’不是预期的

好吧,我让DataContractSerializer使用我的对象图。 有关更多信息,请参阅我之前的问题 树结构的序列化/ Derialization 反序列化器没有任何类型的知识可以映射到此合同 但是,我的一个字段_UserPropertyDefinitions定义如下所示。它定义了此用户可以添加到数据结构中的对象的自定义属性列表。 字符串是标识属性的唯一键,Type是属性的类型,它始终是一个主要类型,如Bool,Int,String等。 每个对象都有一个相应的Dictionary(String key,Object value)集合,用于存储为任何“用户属性”设置的值。 [DataMember] private Dictionary _UserPropertyDefinitions; 当此属性为空集合时,我的对象图序列化很好,但是当我向此集合添加自定义属性时,在尝试使用DataContractSerializer进行序列化时会出现以下exception。 输入数据合约名称为’RuntimeType: http : //schemas.datacontract.org/2004/07/System ‘的’System.RuntimeType’不是预期的。 将任何静态未知的类型添加到已知类型列表中 – 例如,通过使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表中。 如果我删除此字段的DataMember属性,我可以序列化/反序列化而不会获得exception,但当然我放弃了我在此字段中创建的设置。

如何使用DataContractJsonSerializer将类类型而不是命名空间序列化为Json字符串

我正在尝试在WCF服务中使用DataContractJsonSerializer将类层次结构序列化为Json字符串。 序列化派生类的默认行为是将以下键值对添加到对象: “__type”:”ClassName:#Namespace” 我的问题是命名空间很长并且它们使Json字符串膨胀。 我想以某种方式干预序列化并输出它: “__type”:”ClassName” 并且在反序列化时再次介入指向正确的命名空间(我在运行时知道)。 有没有办法做这样的事情?

WCF服务参考 – 获取“XmlException:名称不能以'<'字符开头,hex值0x3C”在客户端

我有一个智能客户端应用程序通过WCF与其服务器通信。 数据在客户端上创建,然后通过服务发送以保持持久性。 服务器和客户端通过共享dll使用相同的域类,我在Visual Studio中使用方便的“添加服务引用”function包装SvcUtil.exe并生成客户端和代理类。 尝试调用服务时出现以下错误: System.Xml.XmlException occurred Message=Name cannot begin with the ‘<' character, hexadecimal value 0x3C. Source=System.Xml LineNumber=0 LinePosition=1 StackTrace: at System.Xml.XmlConvert.VerifyNCName(String name, ExceptionType exceptionType) InnerException: 这特别麻烦,因为该服务一次可以工作数周而不会发生此错误,然后突然且没有警告它将再次出现。 我根本无法找出导致它的原因。 当它确实发生时,我会深入研究如何解决它,并且通常不会提出任何比实际尝试以编程方式将事物序列化为xml而遇到相同错误的人。 我只使用生成的客户端和代理来尝试发送此数据。 我已经查看了我的解决方案的Service References\AwesomeService文件夹中生成的代理,看不到任何看似exception的内容。 生成的文件中唯一出现的尖括号是: * .svcinfo,Reference.svcmap,AwesomeService.disco,AwesomeService.wsdl和* .xsd文件中的xml标记 Reference.cs文件中generics集合的参数 我用来调用服务的代码是这样的: using (var client = new AwesomeServiceClient()) { client.SaveAwesomeness(instanceOfAwesomeness); } 这是使用上面列出的调用代码上方的第一帧开始的堆栈: System.Xml.dll!System.Xml.XmlConvert.VerifyNCName(string name, System.Xml.ExceptionType exceptionType) + 0xb5 […]

DataContractSerializer – 更改命名空间并反序列化绑定到旧命名空间的文件

我有一个使用DataContractSerializer序列化的数据类。 该类使用[DataContract]属性,没有明确的Namespace声明。 因此,生成的xml文件中的命名空间是基于类的命名空间生成的。 该课程基本上如下: namespace XYZ { [DataContract] public class Data { [DataMember(Order = 1)] public string Prop1 { get; set; } [DataMember(Order = 2)] public int Prop2 { get; set; } } } …以及生成的xml: StringValue 11 现在我想通过将[DataContract]属性更改为[DataContract(Namespace = “”)]来更改类的名称空间(实际上将其删除[DataContract(Namespace = “”)] 。 但是,一旦我执行此操作,之前使用原始命名空间序列化的文件不再反序列化。 我收到以下exception: Error in line 1 position XXX. Expecting element ‘Data’ from […]