【问题标题】:Cannot pass an object in wcf无法在 wcf 中传递对象
【发布时间】:2017-03-07 21:08:17
【问题描述】:

我目前正在处理我的最终项目,其中包含 WCF、WPF 和 C# 的使用,我很难通过 wcf 传输对象。 一段时间后我收到一个错误,表明服务器没有提供有意义的响应。 崩溃的方法中使用的类是:

[DataContract]
    public class Player
    {

        //public static int clientID = 0;
        [DataMember]
        public int Wins { get; set; }
        [DataMember]
        public int Loses { get; set; }
        [DataMember]
        public int realID { get; }
        [DataMember]
        public string nickName { get; set; }


        public Player(int Wins, int Loses, string nickName)
        {
            this.Wins = Wins;
            this.Loses = Loses;
            this.nickName = nickName;
            //clientID++;
            realID = 1; //clientID;
        }
    }
    [DataContract]
    public class Run
    {

       [DataMember]
        public List<Player> Players { get; set; }
        [DataMember]
        public bool isActive { get; set; }

        public Run()
        {
            Players = new List<Player>();
        }

        public void playerJoined(Player player)
        {
            Players.Add(player);
        }

        public void playerLeft(Player player)
        {
            if (Players.Contains(player)) Players.Remove(player);
        }

        public void generateRun()
        {
            //  TODO: get a random map from the DB and pass it to all players


            return;
        }
    }

而导致代码崩溃的方法是:

    public Run getRunDetails(int runNumber)
    {
        runNumber = runNumber - 1;
        return Runs[runNumber];
    }

客户端的代码是:

ListBoxItem tempItem = ((ListBoxItem)allRuns.SelectedItem);
    if(tempItem != null && !tempItem.Content.Equals("There are no runs available, create one now."))
    {
        string numString = ((string)tempItem.Content);
        numString = numString.Substring(4, numString.Length - 4);
        run = Service.getRunDetails(int.Parse(numString));
    }

经过一段时间的调试,我发现问题出在 list 变量中,我尝试将其仅更改为 Player 变量 ->同样的错误。使我的缓冲区和消息大小更大也是如此。 代码不会崩溃并发送我的 Run 对象的唯一方法是当 List 不是数据成员时..

//[DataMember]
public List<Player> Players { get; set; }

如果我执行上述操作,代码可以完美运行,但我迫切需要将 List 传递给客户端。 对不起,很长的帖子,但我没有很长的时间,我需要完成它,任何帮助将不胜感激。 (另外,很抱歉格式不好,我已经尽力了)

【问题讨论】:

  • 你能生成一个返回你需要的List的方法吗?
  • @jmag 我想我可以生成一个,但我可以看到随之而来的问题。我更喜欢上面的用法。明天我会尝试用一种方法来做(这里是 00:00),我会在这里更新。谢谢!
  • 我想知道 List 是否被认为是 Data Contract Serializer 支持的类型之一。 msdn.microsoft.com/en-us/library/ms731923(v=vs.110).aspx会不会是这个错误?
  • @jmag - List&lt;T&gt; 受数据合约支持 - 我一直在使用它们。
  • 如果你感兴趣,我在下面找到了解决方案。也谢谢你们。

标签: c# .net wpf wcf


【解决方案1】:

我很确定这里的问题是您的 Player 中没有无参数构造函数...

尝试添加一个

public Player() {}

到你的班级...

或者因为您的 'realId' [DataMember] 没有设置器,请参阅此链接以获取有关正确序列化只读成员的提示。 WCF: Exposing readonly DataMember properties without set?

此外,如果您更改了通过 WCF 通道传递的类中的成员,请不要忘记在 Visual Studio 客户端项目中的 WCF 服务上“更新服务引用”。

【讨论】:

  • 没有 setter 的属性肯定会导致问题 - 我前段时间遇到了这个问题,并花了我一些时间来找出服务崩溃的原因。
  • 添加了空构造函数也添加了 public Player(int Wins, int Loses, string nickName, int realID) { this.Wins = Wins; this.Loses = 失败; this.nickName = 昵称; this.realID = realID; } 以及 public int realID { get;放;它正在工作!非常感谢你们。
  • 太棒了 Nitzan。 WCF/合同序列化与 XML 序列化并不完全相同,但它确实遵循一些相同的原则。实际上,代码中的问题之一是您正在序列化实际上是业务对象的内容,而实际上您应该只在可能的情况下通过线路发送纯数据对象。与其使用参数化构造函数,不如考虑使用构造函数初始化语法。 var MyObject=New Object(){Prop1=Value, Prop2=Value}如果对我有帮助,请标记我的答案! - 谢谢
  • @Alan 实际上这就是我们的讲师希望我们这样做的方式。我标记了您的答案,但它不会显示,因为我有少量的徽章或其他东西〜.〜再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-16
  • 1970-01-01
相关资源
最近更新 更多