2012-05-08 37 views
2

我目前正在尝试解决一个奇怪的问题。一个我无法找到很多信息。紧凑.net和常规.net之间的C#序列化/反序列化

简称:

当反序列化的XML serialzed对象,我得到正确的对象类型的实例,但我只得到对象内部的默认值。

较长的故事:

序列化和反序列化发生在两个不同的平台。 一个是.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生成。

问题:

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

+0

什么串行器?我在猜测BinaryFormatter? –

+0

如果它是XML,那么你如何在两个平台上尝试序列化并查看其差异。根据我的经验,它应该会产生相同的结果,但是再次,Compact Framework中可以有任何东西。真正的解决方案不是使用Compact Framework :) – zmilojko

+0

如果您可以向我们展示两个平台之间的测试xml,它可能会有一些差异。 –

回答

1

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

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

该模式定义了一个基础“路线”对象和一对专门的“路线”对象。 这翻译成xsd2code生成一个基类“baseRoute”和专门的路线,如“someRoute:baseRoute”。

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

我也跟着VinceL's(points for you)建议改为XmlTextWriter。通过这样做字符编码自动完成,这是更方便。

1

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

+0

我们在两个系统上使用完全相同的编码/解码类。可悲的是,我们不能跳过紧凑的框架,因为这个应用程序运行在一个坚固的Windows Phone上。 – Victor

1

我碰到过这一次。

对于我来说,这个问题是添加类每个项目:

命名空间ProjectPC

类SerializableClass1

而且

命名空间ProjectMobile

类SerializableClass1

我是不成功的反序列化从ProjectPCProjectMobile即使类SerializableClass1在两个命名空间是相同的。

对我来说,解决方案是创建一个命名空间,并导入到单独的每个项目:

命名空间ProjectUniversal

类SerializableClass1

做完这些后,你将不得不在您的其他项目中包含此ProjectUniversal

为了更大的灵活性,我还使用自己的静态序列化和反序列化方法制作了ProjectUniversal

我希望这是有道理的。

+0

我也这样做,我所有生成的对象都驻留在共享模块中 – Victor