我只能序列化 167 条记录.任何其他抛出 mscorlib.dll 中发生了类型为“System.StackOverf
本文关键字:发生了 dll mscorlib 类型 StackOverf System 序列化 其他 任何 记录 | 更新日期: 2023-09-27 18:33:35
老实说,我完全筋疲力尽了,我真的不知道该怎么办。我正在使用 Silverlight wcf 开发 Silverlight 应用程序。我的网络配置如下所示:
<system.web>
<httpRuntime maxRequestLength="2147483647" />
<compilation debug="true" targetFramework="4.0" />
</system.web>
<system.diagnostics>
<sources>
<source name="System.ServiceModel" switchValue="Information,Error,ActivityTracing" propagateActivity="true" >
<listeners>
<add name="xml" />
</listeners>
</source>
<source name="CardSpace">
<listeners>
<add name="xml" />
</listeners>
</source>
<source name="System.IO.Log">
<listeners>
<add name="xml" />
</listeners>
</source>
<source name="System.Runtime.Serialization" switchValue="Information,Error,ActivityTracing">
<listeners >
<add name="xml" />
</listeners>
</source>
<source name="System.IdentityModel">
<listeners>
<add name="xml" />
</listeners>
</source>
<source name="System.ServiceModel.MessageLogging">
<listeners>
<add name="xml"/>
</listeners>
</source>
<source name="myUserTraceSource"
switchValue="Information, ActivityTracing">
<listeners>
<add name="xml"/>
</listeners>
</source>
</sources>
<sharedListeners>
<add name="xml"
type="System.Diagnostics.XmlWriterTraceListener"
initializeData="e:'Traces.svclog"
/>
</sharedListeners>
</system.diagnostics>
<system.serviceModel>
<diagnostics>
<messageLogging
logEntireMessage="true"
logMalformedMessages="true"
logMessagesAtServiceLevel="true"
logMessagesAtTransportLevel="true"
maxMessagesToLog="3000"
maxSizeOfMessageToLog="2147483647"
/>
</diagnostics>
<behaviors>
<serviceBehaviors>
<behavior name="ServiceBehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
<dataContractSerializer maxItemsInObjectGraph="2147483647"/>
</behavior>
<behavior name="">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
<dataContractSerializer maxItemsInObjectGraph="2147483647"/>
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<basicHttpBinding>
<binding name="ServicesBinding" maxBufferSize="2147483647" maxBufferPoolSize="2147483647"
maxReceivedMessageSize="2147483647">
<readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
</binding>
</basicHttpBinding>
</bindings>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
<services>
<service behaviorConfiguration="ServiceBehavior" name="SUS.Web.Services.BaseService">
<endpoint address="" binding="basicHttpBinding" bindingConfiguration="ServicesBinding"
contract="SUS.Web.Services.BaseService" />
</service>
<service behaviorConfiguration="ServiceBehavior" name="SUS.Web.Services.NuggetServices">
<endpoint address="" binding="basicHttpBinding" bindingConfiguration="ServicesBinding"
contract="SUS.Web.Services.NuggetServices" />
</service>
<service behaviorConfiguration="ServiceBehavior" name="SUS.Web.Services.WorkspaceServices">
<endpoint address="" binding="basicHttpBinding" bindingConfiguration="ServicesBinding"
contract="SUS.Web.Services.WorkspaceServices" />
</service>
<service behaviorConfiguration="ServiceBehavior" name="SUS.Web.Services.GeneralTemplateService">
<endpoint address="" binding="basicHttpBinding" bindingConfiguration="ServicesBinding"
contract="SUS.Web.Services.GeneralTemplateService" />
</service>
<service behaviorConfiguration="ServiceBehavior" name="SUS.Web.Services.QueryService">
<endpoint address="" binding="basicHttpBinding" bindingConfiguration="ServicesBinding"
contract="SUS.Web.Services.QueryService" />
</service>
</services>
</system.serviceModel>
我在服务器和 Silverlight 项目之间共享程序集,以便可以在它们之间发送类。服务器生成 250 个对象。我可以在最多 167 的集合中发送它们。我可以从这 167 个对象中选择 VmNugget 的任何 250 个对象,这不是任何具体对象的问题。我的视图模型非常复杂,可以相互包含,一个可以是另一个的祖先。MY 类使用 [DataContract] 和 [DataMember] 属性进行修饰。您有什么提示如何在序列化期间检查该过程吗?我的网络服务是这样装饰的:
[ServiceKnownType(typeof(VmCulture))]
[ServiceKnownType(typeof(VmNugget))]
[ServiceKnownType(typeof(VmDesignedNugget))]
[ServiceKnownType(typeof(VmDesigner))]
[ServiceKnownType(typeof(OperationLog))]
[ServiceKnownType(typeof(OperationLog))]
[ServiceKnownType(typeof(VmFile))]
[ServiceKnownType(typeof(VmQuery))]
[ServiceContract(Namespace = "")]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class QueryService : BaseService
有趣的事情:
我已经从这样的属性中删除了所有构造函数:
private ObservableCollection<VmNugget> my;
[DataMember]
public ObservableCollection<VmNugget> My
get{
/* commented
if (this.my == null)
this.my = new ObservableCollection<VmNugget>();
*/
return this.my;
}
我尝试将超过 167 个空对象放入返回的集合中,但我无法序列化它们并发送给客户端。这些对象应为空(未初始化(。
我正在使用带有行中的 OBservableCollection 属性的 VmQuery 类发送它。
谢谢。
托马斯
My ViewModels are pretty complex, can contain each other and one can be ancestor of another one.
这可能是您的问题所在。 我怀疑您有几个对象之间有一个循环引用,并且序列化器溢出。 检查这一点的一种方法是尝试一次序列化一个对象(及其子对象(。 我敢打赌,其中一个(或可能更多(会表现出你描述的行为。
请考虑按 ID 而不是完整对象本身序列化对子对象的引用。
确保没有无限循环或无限递归。过多的方法调用通常表示非常深或无限的递归。
MSDN
。我终于找到了。在一个属性中,我使用了OBservableCollection后代。此类添加了一种奇妙的功能,可以记住对每个包含对象的父集合的引用。:-)解决了,我还活着。世界是如此美丽。