0

我正在使用 neo4jclient,我的一个数据类有一个Collection<string>属性。

保存时,我收到以下错误:

“无法将属性 'SomeArrayPropertyName' 设置为空数组,因为其中没有任何类型的值,也没有预先存在的集合来推断类型,因此无法确定要存储的数组类型。 "

有没有办法保存一个空数组而不将其更改为 Null ?

编辑:

例子:

public class BaseData
{
    public Guid Id { get; set; }
    ...
    ...
    public Collection<string> Subjects { get; set; }

    public BaseData()
    {
        Subjects = new Collection<string>();
    }

    //This method lets Json.Net know whether to serialize 'Subjects'
    public virtual bool ShouldSerializeSubjects()
    {
        return Subjects != null && Subjects.Any();
    }
}

public class ParentData : BaseData
{
}

public class ChildData : ParentData 
{
    public String Name { get; set; }
    public String Description { get; set; }
    ...
    ...
}
4

2 回答 2

3

Neo4jclient 使用 Json.net 来解析数据类,因此您可以将方法添加到 Json.net 将查找的数据类中,格式为ShouldSerializePROPERTYNAME(参见下面的示例)。

public class Actor
{
    public string Name { get;set;}
    public Collection<string> Alternatives { get;set; }

    //This method lets Json.Net know whether to serialize 'Alternatives'
    public bool ShouldSerializeAlternatives()
    {
        return Alternatives != null && Alternatives.Any();
    }
}

这将序列new Actor{Name = "Jeff", Alternatives=new Collection<string>()}化为:{"Name":"Jeff"}- 完全没有Alternatives

显然,这里的缺点是你的类在反序列化时会有一个空集合——你可能会接受,或者不接受——如果不是——你可以在构造函数中粘贴一个初始化器:

public Actor() { Alternatives = new Collection<string>(); }

当 Json.Net 反序列化对象时将调用它。

还有另一种使用IContractResolver的方法,但如果您可以访问数据类,则上述方法是最简单的。

除了不序列化它之外,没有其他方法可以绕过空集合,因为 neo4j 不允许您发送数据。

- 编辑 -

public class BaseData
{
    public Guid Id { get; set; }
    public Collection<string>  Subjects { get; set; }

    public bool ShouldSerializeSubjects()
    {
        return Subjects != null && Subjects.Any();
    }

    public BaseData()
    {
        Subjects = new Collection<string>();
    }
}

public class ParentData :BaseData {}

public class ChildData : ParentData
{
    public string Name { get; set; }
    public string Description { get; set; }
}

class Program
{
    static void Main()
    {
        var client = new GraphClient(new Uri("http://localhost.:7474/db/data/"));
        client.Connect();

        var cd = new ChildData { Name = "c1", Description = "des", Id = Guid.NewGuid() };
        var nodeRef = client.Create(cd);
        var cdRetrieved = client.Get<ChildData>(nodeRef);

        Console.WriteLine("Name: {0}, Description: {1}, Id: {2}, Subjects: {3}", cd.Name, cd.Description, cd.Id, cd.Subjects.Count);
        Console.WriteLine("Name: {0}, Description: {1}, Id: {2}, Subjects: {3}", cdRetrieved.Data.Name, cdRetrieved.Data.Description, cdRetrieved.Data.Id, cdRetrieved.Data.Subjects.Count);

        var json = JsonConvert.SerializeObject(cd);
        Console.WriteLine(json);
}

给出以下输出:

Name: c1, Description: des, Id: ff21b0fe-0a51-4269-a1d4-e148c905a6d7, Subjects: 0
Name: c1, Description: des, Id: ff21b0fe-0a51-4269-a1d4-e148c905a6d7, Subjects: 0
{"Name":"c1","Description":"des","Id":"ff21b0fe-0a51-4269-a1d4-e148c905a6d7"}

最后一行是 Json.Net 的实际 JSON 输出,没有序列化“主题”。

于 2013-07-30T13:18:31.497 回答
0

从Neo4j doco粘贴:

只有在某些前提条件下才能存储空数组。因为 JSON 传输格式不包含数组的类型信息,所以类型是从数组中的值推断出来的。如果数组为空,则 Neo4j Server 无法确定类型。在这些情况下,它将检查是否已经为给定属性存储了一个数组,并在存储空数组时使用存储的数组类型。如果数组不存在,服务器将拒绝该请求。

这意味着在更新 Neo4j 已知数组类型的现有数组时提供空数组有效。新数组属性不能为空。

于 2013-11-18T01:14:14.630 回答