我有searializes並返回一個web服務下面給客戶端作爲字節數組:「System.Collections.Generic.List`1」 SerializationBinder BindToType
[Serializable]
public class MyFile
{
public byte[] Data;
public string FileName;
}
即,我返回一個列出(MyFile)給客戶。
它是由客戶端有以下TYPENAME
System.Collections.Generic.List`1[[NorwayTaxService.Streaming+MyFile, NorwayTaxService, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]
用的組件名稱消耗:
mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
我使用的是以下兩類綁定到反序列化:
[Serializable]
public class MyFileLocal : ISerializable
{
public byte[] Data;
public string FileName;
// The security attribute demands that code that calls
// this method have permission to perform serialization.
[SecurityPermissionAttribute(SecurityAction.Demand, SerializationFormatter = true)]
void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("Data", Data);
info.AddValue("FileName", FileName);
}
// The security attribute demands that code that calls
// this method have permission to perform serialization.
[SecurityPermissionAttribute(SecurityAction.Demand, SerializationFormatter = true)]
private MyFileLocal(SerializationInfo info, StreamingContext context)
{
Data = (byte[])info.GetValue("Data", Data.GetType());
FileName = info.GetString("FileName");
}
}
sealed class MyFileWebToLocalVersionBinder : SerializationBinder
{
public override Type BindToType(string assemblyName, string typeName)
{
Type typeToDeserialize = null;
// For each assemblyName/typeName that you want to deserialize to
// a different type, set typeToDeserialize to the desired type.
String assemVer1 = Assembly.GetExecutingAssembly().FullName;
String typeVer1 = "NorwayTax.Streaming+MyFile";
if (assemblyName == assemVer1 && typeName == typeVer1)
{
// To use a type from a different assembly version,
// change the version number.
// To do this, uncomment the following line of code.
// assemblyName = assemblyName.Replace("1.0.0.0", "2.0.0.0");
// To use a different type from the same assembly,
// change the type name.
typeName = "MyFileLocal";
}
typeToDeserialize = Type.GetType(String.Format("{0}, {1}", typeName, assemblyName));
return typeToDeserialize;
}
}
但是對於我的生活,在GETTYPE語句上嘗試了許多變體,我的T YPE始終爲NULL。
例如,每StackOverflow上一個帖子,我想:
typeToDeserialize = Type.GetType(String.Format("{0}, {1}", "System.Collections.Generic.List`1[[NorwayTax.Streaming+MyFile, NorwayTax]]", assemblyName));
但它沒有工作:(
]括號錯誤放置。 – 2012-07-31 18:21:42
假設你的意思是 typeToDeserialize = Type.GetType(String.Format(「{0},{1}]]」,「System.Collections.Generic.List'1 [[NorwayTax.NorwayTaxService.StreamingService.Streaming + MyFile,NorwayTax 「,assemblyName)); ? 我試過了,它會引發錯誤..請詳細說明。 – flaZer 2012-07-31 18:32:56
我認爲解鎖這個的關鍵是,而不是專注於System.Collections.Generic.List,因爲實際上,這種類型不存在於我的客戶端組裝:NorwayTaxService.Streaming + MyFile。 – flaZer 2012-08-01 13:48:49