为WCF序列化复杂对象
本文关键字:对象 复杂 序列化 WCF | 更新日期: 2023-09-27 18:17:41
我试图通过Windows通信基础传递一个复杂的对象,但我得到读取错误。我能够binaryFormat对象到一个文件,并重新加载和反序列化它。所有组件/引用的组件类都标有Serializable属性。作为一个工作回合,我已经将对象序列化为内存流,通过WCF传递内存流,然后在另一端反序列化内存流。虽然我可以接受这个解决方案,但它似乎不是很整洁。我似乎不知道能够从代理委托书中读出内容的标准是什么。相对简单的对象,甚至包括对另一个类的引用,都可以在没有任何属性的情况下传递和读取。欢迎提出任何建议。
编辑:unrecognized error 109 (0x6d) System.IO.IOException the Read Operation Failed.
Edited As Requested这是类和基类。它非常复杂,这就是为什么我没有在开始时包含代码,但它的二进制序列化很好。
[Serializable]
public class View : Descrip
{
//MsgSentCoreDel msgHandler;
public Charac playerCharac { get; internal set;}
KeyList<UnitV> unitVs;
public override IReadList<Unit> units { get { return unitVs; } }
public View(Scen scen, Charac playerCharacI /* , MsgSentCoreDel msgHandlerI */)
{
playerCharac = playerCharacI;
//msgHandler = msgHandlerI;
DateTime dateTimeI = scen.dateTime;
polities = new PolityList(this, scen.polities);
characs = new CharacList(this, scen.characs);
unitVs = new KeyList<UnitV>();
scen.unitCs.ForEach(i => unitVs.Add(new UnitV(this, i)));
if (scen.map is MapFlat)
map = new MapFlat(this, scen.map as MapFlat);
else
throw new Exception("Unknown map type in View constructor");
map.Copy(scen.map);
}
public void SendMsg(MsgCore msg)
{
msg.dateT = dateTime;
//msgHandler(msg);
}
}
这是基类:
[Serializable]
public abstract class Descrip
{
public DateTime dateTime { get; set; }
public MapStrat map { get; set; }
public CharacList characs { get; protected set; }
public PolityList polities { get; protected set; }
public abstract IReadList<Unit> units { get; }
public GridElList<Hex> hexs { get { return map.hexs; } }
public GridElList<HexSide> sides { get { return map.sides; } }
public Polity noPolity { get { return polities.none; } }
public double hexScale {get { return map.HexScale;}}
protected Descrip ()
{
}
public MapArea newMapArea()
{
return new MapArea(this, true);
}
}
我建议您看一下WCF中数据合约的MSDN文档,因为它提供了一些非常有用的指导。
根据提供的代码和异常信息,有两个疑点:
1)集合和字典,特别是那些基于泛型的,总是给WCF客户端带来困难,因为它不会区分具有相同签名的这两种类型的对象。这通常会导致客户端出现反序列化错误,所以这可能不是您的问题。
如果这是你的问题,我已经在回答这个问题时概述了一些处理客户的步骤。
2)在层次结构的某个地方,你可能有一个不可序列化的类。
如果您的WCF服务托管在IIS中,那么我发现用于跟踪此类问题的最有价值的工具是内置的WCF日志记录器。要启用此日志记录,请在web中添加以下内容。主配置节中的配置文件:
生成错误后,双击svclog文件,将启动Microsoft Service Trace Viewer。左边红色的项目是发生异常的地方,选择一个后,你可以在右边钻取它的细节,它通常会告诉你到底是哪个项目有问题。一旦我们发现了这个工具,追踪这些问题从几个小时到几分钟。
您应该使用DataContract
和DataMember
属性来明确WCF应该序列化哪些字段,否则也要实现ISerializable
并自己编写(反)序列化