紧凑 .net 和常规 .net 之间的 C# 序列化/反序列化
Posted
技术标签:
【中文标题】紧凑 .net 和常规 .net 之间的 C# 序列化/反序列化【英文标题】:C# Serialization / Deserialization between compact .net and regular .net 【发布时间】:2012-05-08 15:11:09 【问题描述】:我目前正在尝试解决一个奇怪的问题。一个我找不到太多信息的。
简而言之:
当反序列化一个 xml 序列化对象时,我得到一个正确对象类型的实例,但我只得到对象内部的默认值。
更长的故事:
序列化和反序列化发生在两个不同的平台上。 一个是 .net compact 框架(用于 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 生成。
问题:
谁有关于这个问题的任何提示或资源?
【问题讨论】:
什么序列化器?我猜是 BinaryFormatter? 如果是XML,你试试在两个平台上序列化看看有什么不同。以我的经验,它应该产生相同的结果,但同样,任何东西都可以在 Compact Framework 中。真正的解决方案是不使用 Compact Framework :) 如果您可以向我们展示两个平台之间的测试 xml,则可能存在一些差异。 添加了更多相关信息 【参考方案1】:两个平台是否使用相同的编码? 我从手持条码扫描仪生成的 Xmls 能够被 PC 上的 VFP 程序读取。 无论如何,我更喜欢使用 XmlTextWriter 而不是 XmlSerializer。
【讨论】:
我们在两个系统上使用完全相同的类进行编码/解码。遗憾的是,我们不能跳过紧凑型框架,因为这个应用程序运行在坚固的 Windows 手机上。【参考方案2】:我遇到过一次。
对我来说,问题在于将类添加到每个项目中:
命名空间 ProjectPC
类 SerializableClass1
和
命名空间 ProjectMobile
类 SerializableClass1
我从 ProjectPC
反序列化到 ProjectMobile
没有成功,尽管 SerializableClass1
类在两个命名空间中是相同的。
我的解决方案是创建一个命名空间并将其分别导入每个项目:
命名空间 ProjectUniversal
类 SerializableClass1
完成后,您必须在每个其他项目中包含此 ProjectUniversal
。
为了获得更大的灵活性,我还使用自己的静态 Serialize 和 Deserialize 方法制作了 ProjectUniversal
。
我希望这是有道理的。
【讨论】:
我也这样做,我生成的所有对象都驻留在共享模块中【参考方案3】:我找到了一个解决方案,我在这里发布给其他有同样问题的人。
在对生成的类进行一些实验后,我发现紧凑的框架不喜欢派生对象。
架构定义了一个基本的“路由”对象和几个专门的“路由”对象。 这转换为 xsd2code 生成基类“baseRoute”和专门的路由,如“someRoute : baseRoute”。
删除继承并将代码从“baseRoute”复制粘贴到专用路由中解决了我所有的问题。
我还按照 VinceL 的(给你的点数)建议更改为 XmlTextWriter。这样做字符编码是自动完成的,这样更方便。
【讨论】:
以上是关于紧凑 .net 和常规 .net 之间的 C# 序列化/反序列化的主要内容,如果未能解决你的问题,请参考以下文章