如何序列化动态对象的列表属性
本文关键字:列表 属性 对象 动态 序列化 | 更新日期: 2023-09-27 18:13:12
我在wcf服务的序列化(JSON输出(方面遇到问题。我使用dynamicobject为我的REST服务返回ligth JSON。
此代码返回一个空结果(无法序列化(:
public DynamicJsonObject DoWork()
{
dynamic result = new DynamicJsonObject();
result.values = new List<int>() { 1, 2 };
}
但是这个代码在上运行得很好
public DynamicJsonObject DoWork()
{
dynamic result = new DynamicJsonObject();
result.values = 1;
}
我的DynamicJsonObject类是:
[Serializable]
public class DynamicJsonObject : DynamicObject, ISerializable
{
private IDictionary<String, Object> Dictionary { get; set; }
public DynamicJsonObject()
{
Dictionary = new Dictionary<String, Object>();
}
public DynamicJsonObject(SerializationInfo info, StreamingContext context)
{
Dictionary = new Dictionary<String, Object>();
}
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
var hasKey = Dictionary.ContainsKey(binder.Name);
result = hasKey ? Dictionary[binder.Name] : null;
return hasKey;
}
public override bool TrySetMember(SetMemberBinder binder, object value)
{
Dictionary[binder.Name] = value;
return true;
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
foreach (String key in Dictionary.Keys)
{
info.AddValue(key.ToString(), Dictionary[key]);
}
}
}
所以我得到了错误错误324(net::ERR_EMPTY_REPONSE(,而不是这个JSON结果{values:[1,2]}
我找到了解决方案。您应该手动声明可序列化的列表。
在我的示例中,我可以在结果对象上添加属性KnowType
[Serializable]
[KnownType(typeof(List<int>))]
public class DynamicJsonObject : DynamicObject, ISerializable
{
...
}
另一种解决方案是在wcf服务类上使用ServiceKnowType
[ServiceContract]
[ServiceKnownType(typeof(List<int>))]
public interface IDataService
{
...
}
有关信息,您可以使用类似KnowType(typeof(List(的泛型属性
List<UserDetails> list = new List<UserDetails>();//UserDetails is my class name it has some properties
对于序列化,您可以使用以下代码:
var objSerializer = new System.Web.Script.Serialization.JavaScriptSerializer();
string sJSON = objSerializer.Serialize(list);
return list;