2

我目前正在尝试解决一个奇怪的问题。一个我找不到太多信息的。

简而言之:

反序列化 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 生成。

问题:

有人有关于这个问题的任何提示或资源吗?

4

3 回答 3

1

两个平台是否使用相同的编码?我从手持条码扫描仪生成的 Xmls 能够被 PC 上的 VFP 程序读取。无论如何,我更喜欢使用 XmlTextWriter 而不是 XmlSerializer。

于 2012-05-08T15:48:59.617 回答
1

我遇到过一次。

对我来说,问题是将类添加到每个项目中:

命名空间项目PC

类 SerializableClass1

命名空间 ProjectMobile

类 SerializableClass1

即使两个名称空间中的类ProjectPC相同,我也没有成功反序列化 from 。ProjectMobileSerializableClass1

我的解决方案是创建一个命名空间并将其分别导入每个项目:

命名空间 ProjectUniversal

类 SerializableClass1

完成后,您必须将其包含ProjectUniversal在您的每个其他项目中。

为了获得更大的灵活性,我还制作ProjectUniversal了自己的静态 Serialize 和 Deserialize 方法。

我希望这是有道理的。

于 2012-05-09T13:48:08.657 回答
1

我找到了一个解决方案,并将其发布在这里以供其他有同样问题的人使用。

在对生成的类进行一些实验后,我发现紧凑的框架不喜欢派生对象。

该模式定义了一个基本的“路由”对象和几个专门的“路由”对象。这转化为 xsd2code 生成一个基类“baseRoute”和专门的路由,如“someRoute : baseRoute”。

删除继承并将代码从“baseRoute”复制粘贴到专用路由中解决了我所有的问题。

我还按照 VinceL 的(给你的点数)建议更改为 XmlTextWriter。通过这样做字符编码是自动完成的,这更方便。

于 2012-05-09T14:02:29.350 回答