Использование RdfProperty массива для пользовательского класса
Вопрос
Я определил:
[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 было необработанное сообщение = "Ссылка на объект не задано для экземпляра объекта". Источник= "NC3A.SI.Rowlex" Трассировка стека:в NC3A.SI.Rowlex.RdfPropertyAttribute.Извлекать диапазон(MemberInfo MemberInfo, Int32 и minCardinality, Int32 и maxCardinality) в NC3A.SI.Rowlex.RdfPropertyAttribute.Извлекать диапазон(MemberInfo MemberInfo) в NC3A.SI.Rowlex.Rdfizer.AppendProperty(RdfDocument doc, MemberInfo MemberInfo, Атрибут RdfPropertyAttribute, объект элемент, строковый resourceUri) в NC3A.SI.Rowlex.Rdfizer.AppendSingleRdfSerializableObject(RdfDocument документ doc, элемент объекта). в NC3A.SI.Rowlex.Rdfizer.ProcessItem(RdfDocument документ, элемент объекта, строка[] rangeTypeUris) в NC3A.SI.Rowlex.Rdfizer.Выполнить сериализацию (IEnumerable объекты) в NC3A.SI.Rowlex.Rdfizer.Сериализовать (IEnumerable объекты, логическое значение Допускает отмену сериализации объектов) в NC3A.SI.Rowlex.Rdfizer.Сериализовать (объект элемент) в ROWLEXtest1.Program.Main(строка[] аргументы) в C: OWLEXtest1 OWLEXtest1\Program.cs:line 40 в системе.AppDomain._nExecuteAssembly(Сборка сборка, строка[] аргументов) в Microsoft.VisualStudio.Процесс размещения.HostProc.RunUsersAssembly() в системе.Обработка потоков.ExecutionContext.Run(ExecutionContext ExecutionContext, ContextCallback обратный вызов, состояние объекта) в системе.Обработка потоков.ThreadHelper.ThreadStart() Исключение InnerException:
Решение
То, что вы сделали, выглядит нормально, но есть одна ошибка:Объявление RdfProperty должно принимать "false" для MyTestProp, поскольку MyTestProp - это не свойство типа данных, а свойство объекта (оно возвращает объекты, а не литералы).
Однако я не уверен, что это корень вашей проблемы.И даже если это так, вы должны получить приличное сообщение об ошибке со значимым текстом вместо глупого исключения NullReferenceException.Поэтому я хотел бы попытаться воспроизвести вашу ошибку и предоставить исправление, если это применимо.Не могли бы вы, пожалуйста, уточнить
- класс и его оформление, в котором размещается MyTestProp,
- код, в котором вы создаете экземпляр этого класса, и
- код, который вы используете для сериализации.
- Если бы вы применили атрибуты уровня сборки (для сопоставления пространства имен онтологии), пожалуйста, укажите и это.
Может быть, вы могли бы рассмотреть возможность отправки мне вашего примера кода [администратору по адресу rowlex.net].
Редактировать:Я мог бы воспроизвести исключение, это ошибка в ROWLEX. Исправленную версию 2.0.1 теперь можно загрузить с РОУЛЕКС Сайт.