首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >紧致C#与正则.net之间的序列化/反序列化

紧致C#与正则.net之间的序列化/反序列化
EN

Stack Overflow用户
提问于 2012-05-08 15:11:09
回答 3查看 1.7K关注 0票数 2

我现在正试图解决一个复杂的问题。一个我找不到很多信息的。

简而言之:

当反序列化xml序列化对象时,我会得到一个正确对象类型的实例,但我只能在对象中获得默认值。

更长的故事:

序列化和反序列化发生在两个不同的平台上。一种是.net紧凑框架(用于windows手机),另一种是常规.net框架。

在同一个平台上序列化然后反序列化会产生一个正确填充的对象,只有当序列化的字符串被发送到另一个平台时,才会出现这个问题。

我还从另一个服务获得了测试xml文件,该服务将为我的服务提供数据,这些xml文件将正确地反序列化。

规范:

生成的XML在不同平台之间略有不同。(注意,这些是来自内部xml结构的片段,我在其中发现了重复出现的差异。读:单位不是根节点)

客户端(电话,契约框架)

代码语言:javascript
复制
<Unit>
    <UnitId xmlns="">555</UnitId>
    <VehicleId xmlns="">555</VehicleId>
    <EmployeeId xmlns="">004</EmployeeId>
</Unit>

服务器(常规.net服务器)

代码语言:javascript
复制
<Unit xmlns="">
    <UnitId>555</UnitId>
    <VehicleId>555</VehicleId>
    <EmployeeId>004</EmployeeId>
</Unit>

来自父系统(未知平台)

代码语言:javascript
复制
<Unit>
   <UnitId>308</UnitId>
   <VehicleId>307</VehicleId>
   <EmployeeId>ASA 500</EmployeeId>
</Unit>

此外,父系统没有设置标准命名空间(xmlns),而是在根节点中使用前缀,如下所示:

代码语言:javascript
复制
<amg:RequestFinishRoute xmlns:amg="http://beans.order.integration.tt.transware.se/order/trackingFinishRoute">

而我们通过序列化创建的数据提供:

代码语言:javascript
复制
<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">

我用的是:

代码语言:javascript
复制
System.Xml.Serialization.XmlSerializer

序列化程序以执行序列化/反序列化(仅在紧凑的框架中支持序列化程序)。

这样做的代码是由xsd2code生成的。

问题:

有人对这个问题有什么建议或参考资料吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-05-09 14:02:29

我找到了一个解决方案,我把它发到这里给有同样问题的人。

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

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

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

我还遵循了VinceL(为您分)的建议,将其改为XmlTextWriter。这样,字符编码就会自动完成,这就更方便了。

票数 1
EN

Stack Overflow用户

发布于 2012-05-08 15:48:59

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

票数 1
EN

Stack Overflow用户

发布于 2012-05-09 13:48:08

我碰到过一次这个。

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

命名空间ProjectPC

类SerializableClass1

命名空间ProjectMobile

类SerializableClass1

尽管类ProjectPC在两个名称空间中是相同的,但从SerializableClass1ProjectMobile的反序列化没有成功。

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

命名空间ProjectUniversal

类SerializableClass1

完成之后,您将不得不将此ProjectUniversal包含在其他每个项目中。

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

我希望这是合理的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10501392

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档