为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序列化复杂对象

我建议您看一下WCF中数据合约的MSDN文档,因为它提供了一些非常有用的指导。

根据提供的代码和异常信息,有两个疑点:

1)集合和字典,特别是那些基于泛型的,总是给WCF客户端带来困难,因为它不会区分具有相同签名的这两种类型的对象。这通常会导致客户端出现反序列化错误,所以这可能不是您的问题。

如果这是你的问题,我已经在回答这个问题时概述了一些处理客户的步骤。

2)在层次结构的某个地方,你可能有一个不可序列化的类。

如果您的WCF服务托管在IIS中,那么我发现用于跟踪此类问题的最有价值的工具是内置的WCF日志记录器。要启用此日志记录,请在web中添加以下内容。主配置节中的配置文件:

生成错误后,双击svclog文件,将启动Microsoft Service Trace Viewer。左边红色的项目是发生异常的地方,选择一个后,你可以在右边钻取它的细节,它通常会告诉你到底是哪个项目有问题。一旦我们发现了这个工具,追踪这些问题从几个小时到几分钟。

您应该使用DataContractDataMember属性来明确WCF应该序列化哪些字段,否则也要实现ISerializable并自己编写(反)序列化