Я определил:
[RdfSerializable]
public class SomeItem
{
// Unique identificator of the resource
[ResourceUri]
public string ID { get; set; }
[RdfProperty( true )]
public string SomeData { get; set; }
}
and in some other class:
[RdfProperty(true)]
public SomeItem[] MyTestProp
{
get
{
return new SomeItem[] { new SomeItem() { ID="1", SomeData="test1" }, new SomeItem() { ID="2", SomeData = "test2" } };
}
}
Когда я пытаюсь сериализовать класс, содержащий этот пользовательский "MyTestProp", и он дал мне это сообщение:
Ссылка на объект не установлена на экземпляр объекта.
Описание: Необработанное исключение произошли во время выполнения текущий веб-запрос. Пожалуйста, просмотрите трассировки стека для получения дополнительной информации о ошибка и где она возникла в код.
Сведения об исключении: System.NullReferenceException: объект ссылка не установлена в экземпляр объект.
Я ошибаюсь в определении этих свойств или существует специальный способ определения массива в пользовательский класс? Обратите внимание, что сериализация массива в строку, например, не разрушает меня таким образом, но работает.
Целый источник:
using System;
using NC3A.SI.Rowlex;
[assembly: Ontology("ROWLEXtest1", "http://www.test.com/MyOntology")]
namespace ROWLEXtest1
{
[RdfSerializable( HasResourceUri=false )]
public class Item
{
[RdfProperty(true)]
public string MyProp;
}
[RdfSerializable]
public class AllItems
{
[RdfProperty(true)] public string mTitle;
private int id = new Random().Next(0, 20);
[ResourceUri]
public string ResourceUri
{
get { return "This " + id.ToString(); }
}
[RdfProperty(false)]
public Item[] Items;
}
class Program
{
static void Main(string[] args)
{
var item = new AllItems();
item.mTitle = "Hello World!";
item.Items = new Item[] { new Item(){ MyProp = "test1" }, new Item(){ MyProp = "test2" } };
var doc = Rdfizer.Serialize(item);
System.Console.Out.Write(doc.ToString());
}
}
}
Исключение:
Исключено System.NullReferenceException. необработанное сообщение = "Ссылка на объект не установлен в экземпляр объекта." Source = "NC3A.SI.Rowlex" StackTrace: в NC3A.SI.Rowlex.RdfPropertyAttribute.ExtractRange(MemberInfo memberInfo, Int32 & minCardinality, Int32 & maxCardinality) в NC3A.SI.Rowlex.RdfPropertyAttribute.ExtractRange(MemberInfo MemberInfo) в NC3A.SI.Rowlex.Rdfizer.AppendProperty(RdfDocument doc, MemberInfo memberInfo, Атрибут RdfPropertyAttribute, объект item, String resourceUri) в NC3A.SI.Rowlex.Rdfizer.AppendSingleRdfSerializableObject(RdfDocument doc, Объект) в NC3A.SI.Rowlex.Rdfizer.ProcessItem(RdfDocument doc, Объект, Строка [] rangeTypeUris) в NC3A.SI.Rowlex.Rdfizer.ExecuteSerialization(IEnumerable объекты) в NC3A.SI.Rowlex.Rdfizer.Serialize(IEnumerable объектов, булевых tolerateUnserializebleObjects) в NC3A.SI.Rowlex.Rdfizer.Serialize(объект пункт) в ROWLEXtest1.Program.Main(String [] args) в C:\ROWLEXtest1\ROWLEXtest1\Program.cs: линия 40 в System.AppDomain._nExecuteAssembly (сборка сборка, String [] args) в Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() в System.Threading.ExecutionContext.Run(ExecutionContext executeContext, ContextCallback обратный вызов, состояние объекта) в System.Threading.ThreadHelper.ThreadStart() InnerException:
То, что вы сделали, выглядит нормально, но есть одна ошибка: Объявление RdfProperty должно принимать значение "false" для MyTestProp, поскольку MyTestProp не является свойством типа данных, а свойство объекта (оно возвращает объекты, а не литералы).
Однако я не уверен, что это корень вашей проблемы. И даже если это так, вы должны получить достойное сообщение об ошибке со значимым текстом вместо глупого NullReferenceException. Поэтому я хотел бы попытаться воспроизвести вашу ошибку и предоставить исправление, если это применимо. Не могли бы вы указать
Возможно, вы могли бы отправить мне свой пример кода в [admin at rowlex.net].
EDIT: Я могу воспроизвести исключение, это ошибка в ROWLEX. Исправленная версия 2.0.1 теперь может быть загружена с сайта ROWLEX.