紧凑.net和常规.net之间的C#序列化/反序列化

时间:2012-05-08 15:11:09

标签: c# .net windows-mobile compact-framework

我目前正试图解决一个奇怪的问题。一个我无法找到有关的信息。

简而言之:

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

问题:

任何人都有关于此问题的任何提示或资源?

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

我遇到过这一次。

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

  

命名空间ProjectPC

     

class SerializableClass1

  

命名空间ProjectMobile

     

class SerializableClass1

即使类ProjectPC在两个名称空间中都相同,我也无法从ProjectMobile反序列化到SerializableClass1

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

  

命名空间ProjectUniversal

     

class SerializableClass1

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

为了获得更大的灵活性,我还使用自己的静态Serialize和Deserialize方法创建了ProjectUniversal

我希望这是有道理的。

答案 2 :(得分:1)

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

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

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

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

我也跟着VinceL(指向你)建议改为XmlTextWriter。通过这样做,字符编码自动完成,这样更方便。