使用数组的RdfProperty来定制类

时间:2009-07-13 21:14:57

标签: c# .net rdf rowlex semweb

我定义了:

[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:Object   引用未设置为的实例   对象

我在定义这些属性时是错误的,还是有一种特殊的方法可以将数组定义为自定义类?请注意,例如将数组序列化为字符串并不会让我崩溃,但它正在运行。

整个来源:

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是   未处理的Message =“对象引用   没有设置为对象的实例。“   Source =“NC3A.SI.Rowlex”StackTrace:          at NC3A.SI.Rowlex.RdfPropertyAttribute.ExtractRange(MemberInfo)   memberInfo,Int32& minCardinality,   INT32和放大器; maxCardinality)          at NC3A.SI.Rowlex.RdfPropertyAttribute.ExtractRange(MemberInfo)   的MemberInfo)          在NC3A.SI.Rowlex.Rdfizer.AppendProperty(RdfDocument   doc,MemberInfo memberInfo,   RdfPropertyAttribute属性,Object   item,String resourceUri)          在NC3A.SI.Rowlex.Rdfizer.AppendSingleRdfSerializableObject(RdfDocument)   doc,Object item)          在NC3A.SI.Rowlex.Rdfizer.ProcessItem(RdfDocument   doc,Object item,String []   rangeTypeUris)          在NC3A.SI.Rowlex.Rdfizer.ExecuteSerialization(IEnumerable   对象)          在NC3A.SI.Rowlex.Rdfizer.Serialize(IEnumerable   对象,布尔值   tolerateUnserializebleObjects)          在NC3A.SI.Rowlex.Rdfizer.Serialize(对象   项目)          在ROWLEXtest1.Program.Main(String []   args)in   C:\ ROWLEXtest1 \ ROWLEXtest1 \的Program.cs:行   40          在System.AppDomain._nExecuteAssembly(程序集   assembly,String [] args)          在Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()          在System.Threading.ExecutionContext.Run(ExecutionContext   executionContext,ContextCallback   回调,对象状态)          在System.Threading.ThreadHelper.ThreadStart()   的InnerException:

1 个答案:

答案 0 :(得分:2)

你做的看起来不错,但有一个错误: 对于MyTestProp,RdfProperty声明应该为“false”,因为MyTestProp不是数据类型属性,而是对象属性(它返回对象而不是文字)。

但是,我不确定这是你问题的根源。即使它是,你应该得到a decent error message with meaningful text instead of silly NullReferenceException。因此,我想尝试重现您的错误并提供修复(如果适用)。可以请你指定

  • 承载MyTestProp的类及其装饰
  • 您实例化该类的代码,
  • 用于序列化的代码。
  • 如果您应用程序集级别属性(对于本体 - 名称空间映射),请同时指出。

也许您可以考虑将您的代码示例发送给[admin at rowlex.net]。

编辑: 我可以重现异常,它是ROWLEX中的一个错误。 现在可以从ROWLEX网站下载固定的2.0.1版本。