C# 序列化/压缩 .net 和常规 .net 之间的反序列化
本文关键字:net 之间 反序列化 常规 压缩 序列化 | 更新日期: 2023-09-27 18:33:27
我目前正在尝试解决一个奇怪的问题。 我找不到太多信息。
总之:
反序列化 xml 序列化对象时,我得到了正确对象类型的实例,但我只在对象内部获取默认值。
长话短说:
序列化和反序列化发生在两个不同的平台上。一个是.net紧凑框架(用于Windows手机(,另一个是常规的.net框架。
在同一平台上序列化然后反序列化会产生正确填充的对象,仅当将序列化字符串发送到另一个平台时才会出现问题。
我还从另一个服务中获得了测试xml文件,该服务将为我的服务提供数据,这些xml文件可以正确反序列化。
细节:
生成的 XML 在平台之间略有不同。(请注意,这些是来自内部 xml 结构的片段,我已经在其中确定了重复出现的差异。阅读:单元不是根节点(
客户端(电话、紧凑型框架(
<Unit>
<UnitId xmlns="">555</UnitId>
<VehicleId xmlns="">555</VehicleId>
<EmployeeId xmlns="">004</EmployeeId>
</Unit>
服务器(常规 .net 服务器(
<Unit xmlns="">
<UnitId>555</UnitId>
<VehicleId>555</VehicleId>
<EmployeeId>004</EmployeeId>
</Unit>
从父系统(未知平台(
<Unit>
<UnitId>308</UnitId>
<VehicleId>307</VehicleId>
<EmployeeId>ASA 500</EmployeeId>
</Unit>
此外,父系统不是设置标准命名空间 (xmlns(,而是在根节点中使用前缀,如下所示:
<amg:RequestFinishRoute xmlns:amg="http://beans.order.integration.tt.transware.se/order/trackingFinishRoute">
而我们通过序列化创建的数据提供:
<RequestFinishRoute xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://beans.order.integration.tt.transware.se/order/trackingFinishRoute">
我使用:
System.Xml.Serialization.XmlSerializer
序列化程序进行序列化/反序列化(仅在紧凑框架中支持的序列化程序(。
执行此操作的代码由 xsd2code 生成。
问题:
有人对这个问题有任何提示或资源吗?
两个平台是否使用相同的编码?我的Xmls从手持式条形码扫描仪生成,能够通过PC上的VFP程序读取。无论如何,我更喜欢使用XmlTextWriter而不是XmlSerializer。
我曾经遇到过这个。
对我来说,问题是将类添加到每个项目中:
命名空间 项目电脑
类可序列化类 1
和
命名空间 项目移动
类可序列化类 1
我未能成功地从 ProjectPC
反序列化为 ProjectMobile
,即使类SerializableClass1
在两个命名空间中是相同的。
对我来说,解决方案是创建一个命名空间并将其分别导入到每个项目中:
命名空间 项目通用
类可序列化类 1
完成此操作后,您必须将此ProjectUniversal
包含在其他每个项目中。
为了获得更大的灵活性,我还使用自己的静态序列化和反序列化方法制作了ProjectUniversal
。
我希望这是有道理的。
我找到了一个解决方案,我在这里为有同样问题的其他人发布它。
在对生成的类进行一些实验后,我发现紧凑的框架不喜欢派生对象。
架构定义了一个基本的"路由"对象和几个专用的"路由"对象。这转换为xsd2code生成基类"baseRoute"和专用路由,如"someRoute : baseRoute"。
删除继承并将代码从"baseRoute"复制粘贴到专用路由中解决了我的所有问题。
我也遵循了VinceL的建议(给你点(改用XmlTextWriter。通过这样做,字符编码会自动完成,这更方便。