我有这种情况:
STRUCTURE :
Entity A
ChildEntity B
Assume this is data in my database
A1
(childs)
B1
B2
B3
A2
(childs)
B4
B5
B6
使用linq to SQL。我想要一个B
项列表
引用父母(A
项目)
服务器端在我的Web服务将数据发送回客户端
之前就可以了我得到了这样的结构:
B1
A1
(childs)
B1
B2
B3
B2
A1 (parent)
(childs)
B1
B2
B3
...
...
如果我尝试浏览图表,则所有项目似乎都在正确的位置。
客户端,在服务器序列化和客户端反序列化后我遇到这种情况:
B1
A1 (parent)
(childs)
B1
B2
B3
B2
NULL
B3
NULL
B4
A2 (parent)
(childs)
B4
B5
B6
B5
NULL
B6
NULL
只有A
个项目中的一个子项保留对父项的引用。我试着看看客户端和服务器端生成的XML,但找不到问题。
有人可以帮我理解为什么会这样吗? 或者有一个建议?
注意:
如果我尝试压缩列表服务器端,如byte[]
,并将其解压缩回客户端,将压缩对象转换为List<B>
,所有项目也保持正确的关系,客户端,一切正常。所以我想这是序列化/反序列化中的一个问题
我正在使用:
答案 0 :(得分:1)
我发现问题出在哪里: 序列化属性时的XMLSerializer显然以随机顺序将它们放入XML中(可能它遵循从Datamodel edmx获得的某些顺序,我没有对它进行过调查) 所以我在XMLSerializer生成的XML中得到了这个场景:
<b:CHILD_Entity **z:Id="i1"** xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/">
<b:CHILD_ID>008acd9a-2074-46b0-b73b-90b8c9123f6f</b:CHILD_ID>
<b:ReasonInfo>HRC->PLC 11</b:ReasonInfo>
<b:StartTime>2011-11-29T09:22:36.553</b:StartTime>
<b:EndTime>2011-11-29T10:31:58.507</b:EndTime>
<b:Quantity>0</b:Quantity>
<b:PARENT_Entity z:Id="i2">
<b:Description i:nil="true"></b:Description>
<b:UtilizationType>COMMITTED</b:UtilizationType>
<b:Reason>SETUP</b:Reason>
<b:ReasonInfo></b:ReasonInfo>
<b:CHILD_Entities>
<b:**CHILD_Entity** **z:Ref="i1"**></b:CHILD_Entity>
<b:**CHILD_Entity** **z:Id="i3"** xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/">
<b:CHILD_ID>008acd9a-2074-46b0-b73b-90b8c9123f6f</b:CHILD_ID>
<b:ReasonInfo>HRC->PLC 11</b:ReasonInfo>
<b:StartTime>2011-11-29T09:22:36.553</b:StartTime>
**<b:ProductionCapabilityUtilization z:Ref="i2"></b:ProductionCapabilityUtilization>**
***<b:PARENT_ID>32864280-fe68-4b21-8375-b57ae8bbd7e6</b:PARENT_ID>***
..........
</b:CHILD_Entity>
..................
</b:CHILD_Entities>
**<b:PARENT_ID>32864280-fe68-4b21-8375-b57ae8bbd7e6</b:PARENT_ID>**
</b:PARENT_Entity>
***<b:PARENT_ID>32864280-fe68-4b21-8375-b57ae8bbd7e6</b:PARENT_ID>***
<b:PROP1>MLM</b:PROP1>
<b:PROP2>MLM1</b:PROP2>
<b:Reason>RUN</b:Reason>
</b:CHILD_Entity>
<b:**CHILD_Entity** **z:Ref="i3"** xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/"></b:CHILD_Entity>
问题是,有时FIXUP生成的代码会在设置PARENT_Entity.PARENT_ID之前和触发CHILD_Entity.PARENT_Entity SETTER之后尝试在CHILD_Entity上设置PARENTID。 所以我们得到一个奇怪的情况,其中CHILD_Entity.PARENT有一个值,但CHILD_Entity.Parent.PARENT_ID = NULL,因为DESERIALIZER仍然没有从XML处理该属性
要解决这类问题,我必须以这种方式修改POCO模板:
设置计数器变量int propertyPosCounter = 1;
设置DataMemberAttribute时指定ORDER
[DataMemberAttribute(Order = <#=propertyPosCounter.ToString()#>)]
在propertyPosCounter +=1;
重复每个原始属性 - 复杂属性 - 导航属性的此过程 为了让我们在生成的XML中始终使用正确的顺序来使用POCO反序列化客户端大小,并且它的Fixup概念
在调整POCO.tt模板之后,我解决了这些冲突并且没有遇到任何问题 序列化 - &gt;反序列化从我的WCF服务传递到客户端应用程序的数据结构 XML序列化的结果是:
<b:CHILD_Entity z:Id="i1" xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/">
<b:CHILD_ID>008acd9a-2074-46b0-b73b-90b8c9123f6f</b:CHILD_ID>
<b:PARENT_ID>32864280-fe68-4b21-8375-b57ae8bbd7e6</b:PARENT_ID>
<b:PROP1>MLM</b:PROP1>
<b:PROP2>MLM1</b:PROP2>
<b:Reason>RUN</b:Reason>
<b:ReasonInfo>HRC->PLC 11</b:ReasonInfo>
<b:StartTime>2011-11-29T09:22:36.553</b:StartTime>
<b:EndTime>2011-11-29T10:31:58.507</b:EndTime>
<b:Quantity>0</b:Quantity>
<b:PARENT_Entity z:Id="i2">
<b:PARENT_ID>32864280-fe68-4b21-8375-b57ae8bbd7e6</b:PARENT_ID>
<b:Description i:nil="true"></b:Description>
<b:UtilizationType>COMMITTED</b:UtilizationType>
<b:Reason>SETUP</b:Reason>
<b:ReasonInfo></b:ReasonInfo>
<b:CHILD_Entity>
<b:CHILD_Entity z:Ref="i1"></b:CHILD_Entity>
<b:**CHILD_Entity** **z:Id="i3"** xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/">
<b:CHILD_ID>008acd9a-2074-46b0-b73b-90b8c9123f6f</b:CHILD_ID>
***<b:PARENT_ID>32864280-fe68-4b21-8375-b57ae8bbd7e6</b:PARENT_ID>***
<b:ReasonInfo>HRC->PLC 11</b:ReasonInfo>
<b:StartTime>2011-11-29T09:22:36.553</b:StartTime>
..........
**<b:ProductionCapabilityUtilization z:Ref="i2"></b:ProductionCapabilityUtilization>**
</b:CHILD_Entity>
</b:CHILD_Entity>
</b:PARENT_Entity>
</b:CHILD_Entity>
我试图尽可能清楚,但情节并非微不足道,所以如果有人需要澄清,请不要犹豫,我会尽快回答。
希望这篇文章可以帮助别人:)
此致 Luigi Martinez Bianchi