我在序列化方面遇到困难。我有一个aspx页面,它使用ajax调用从服务器端返回对象。
期望的输出
ModelPoints = [[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3]](对于WebGL)
实际输出 ModelPoints = {{积分= [1,2,3]},{积分= [1,2,3]},{积分= [1,2,3]},{积分= [1,2,3]} }
申请流程
Ajax - > Aspx - > WCF - > Aspx - > Ajax的
以下是错误序列化的类。我如何对其进行重组以使其有效?我不想多次解析18000+点,因此服务器的输出应该是正确的格式。即我无法在客户端解析它。
对象名称Points来自参数名称,如何为浮动的2D数组执行此操作。
以下课程
[Serializable()]
public class ModelPoint
{
public ModelPoint()
{
}
public ModelPoint(float x, float y, float z)
{
_points = new List<Nullable<float>>();
_points.Add(x);
_points.Add(y);
_points.Add(z);
}
private List<Nullable<float>> _points;
public List<Nullable<float>> Points
{
get {return _points;}
set { _points = value; }
}
}
[Serializable()]
public class Model
{
private List<ModelPoint> _modelPoints;
[System.Xml.Serialization.XmlArray("ModelPoints", IsNullable = true)]
[System.Xml.Serialization.XmlArrayItem()]
public List<ModelPoint> ModelPoints
{
get {return _modelPoints;}
set { _modelPoints = value; }
}
}
答案 0 :(得分:0)
在json中,方括号[]表示数组,花括号{}表示对象。所以数据结构由你想要的输出代表:
[[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3]]
是一个二维整数数组。要在C#中获得它,您可以使用类似:
List<List<int>> model = new List<List<int>>()
model.Add(new List<int>() {1, 2, 3});
model.Add(new List<int>() {1, 2, 3});
或类似的东西:
int[,] model = new int[5, 3] {{1,2,3},{1,2,3}};
答案 1 :(得分:0)
您基本上只需要生成二维数组。假设您在WCF端点上使用DataContractJsonSerializer,您的Model类应如下所示:
public class Model
{
private float[][] _modelPoints;
public float[][] ModelPoints
{
get { return _modelPoints; }
set { _modelPoints = value; }
}
}
请注意,我删除了所有序列化属性(如果将它们留在序列化程序中,则会神奇地输出支持字段而不是属性)并且我不再使用ModelPoint类。如果我输入DataContractJSONSerializer,我得到你想要的输出:
var ds = new DataContractJsonSerializer(typeof(Model));
var model = new Model
{
ModelPoints = new[] {
new[] { 1f, 2f, 3f },
new[] { 4f, 5f, 6f } }
};
var sb = string.Empty;
using (var ms = new MemoryStream())
{
ds.WriteObject(ms, model);
sb= Encoding.UTF8.GetString(ms.ToArray());
}
Debug.WriteLine(sb);
在调试控制台中给出类似于您期望接收的内容。
{"ModelPoints":[[1,2,3],[4,5,6]]}