Ale*_*tov 5 c# wcf serialization
我有一个客户端 - 服务器应用程序,其中一部分通过WCF(netTcp绑定)相互"交谈".
我有我的DataContract,它有一个第三方类的字段:
[Serializable]
public class MyResult{
public ThirdPartyResult Result {get;set;}
/* other fields */
}
Run Code Online (Sandbox Code Playgroud)
使用反射我看到这个:
[Serializable]
public class ThirdPartyResult {
private IList result;
public IList Result
{
get { return result ?? (result = new ArrayList());}
}
}
Run Code Online (Sandbox Code Playgroud)
从客户端调用服务器时我有resultas ArrayList服务器.在客户端之后,该result字段变为固定大小的数组.
我没有使用添加服务引用,但我使用程序集共享,只是这样做
ChannelFactory<IMyContract>.CreateChannel(new NetTcpBinding("Configuration.Name"), address);
Run Code Online (Sandbox Code Playgroud)
更新:服务合同
[ServiceContract]
[ServiceKnownType(typeof(ArrayList))]
[ServiceKnownType(typeof(ThirdPartyResult))]
public interface IMyContract
{
MyResult GetResult();
}
Run Code Online (Sandbox Code Playgroud)
现在问题是:
我如何告诉WCF使用ArrayList而不是Array?
我提出了一个非常糟糕的解决方案(从我的角度来看)
通常我希望ArrayList保留一个以便能够添加项目.最后我想出了下面的解决方案.是的,我知道,这是完全糟糕的,这就是为什么我还在寻找一些更好的变体.
if (thirdParty.Results != null && thirdParty.Results.IsFixedSize)
{
var results = new ArrayList(thirdParty.Results);
// Finding result by ReferenceEquals to not be tight to private variable name
var resultsField = thirdParty.GetType()
.GetFields(BindingFlags.Default | BindingFlags.Instance | BindingFlags.NonPublic)
.Where(f => ReferenceEquals(f.GetValue(thirdParty), thirdParty.Results))
.FirstOrDefault();
if (resultsField != null)
resultsField.SetValue(thirdParty, results);
}
thirdParty.AddResult(otherChild);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2935 次 |
| 最近记录: |