Использование RdfProperty массива для пользовательского класса - PullRequest
2 голосов
/ 14 июля 2009

Я определил:

[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 документ, объект) в NC3A.SI.Rowlex.Rdfizer.ProcessItem (RdfDocument документ, объект, строка [] 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 (Assembly сборка, строка [] args) в Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly () в System.Threading.ExecutionContext.Run (ExecutionContext executeContext, ContextCallback обратный вызов, состояние объекта) в System.Threading.ThreadHelper.ThreadStart () InnerException:

1 Ответ

2 голосов
/ 14 июля 2009

То, что вы сделали, выглядит нормально, но есть одна ошибка: Объявление RdfProperty должно принимать значение «false» для MyTestProp, поскольку MyTestProp - это не свойство типа данных, а свойство объекта (оно возвращает объекты, а не литералы).

Однако я не уверен, что это корень вашей проблемы. И даже если это так, вы должны получить приличное сообщение об ошибке со значимым текстом вместо глупого NullReferenceException . Поэтому я хотел бы попытаться воспроизвести вашу ошибку и предоставить исправление, если это применимо. Не могли бы вы указать

  • класс и его оформление, в котором размещен MyTestProp,
  • код, в котором вы создаете экземпляр этого класса, и
  • код, который вы используете для сериализации.
  • Если бы вы применили атрибуты уровня сборки (для онтологии - отображение пространства имен), укажите это тоже.

Возможно, вы могли бы подумать о том, чтобы отправить мне свой пример кода [admin at rowlex.net].

EDIT: Я мог воспроизвести исключение, это ошибка в ROWLEX. Исправленную версию 2.0.1 теперь можно загрузить с сайта ROWLEX .

...