2

私は定義しました:

[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」を含むクラスをシリアル化しようとすると、次のメッセージが表示されました。

オブジェクト参照がオブジェクト インスタンスに設定されていません。

説明: 現在の Web 要求の実行中に未処理の例外が発生しました。エラーの詳細とコード内のどこでエラーが発生したかについては、スタック トレースを確認してください。

例外の詳細: 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 は処理されませんでした Message="オブジェクト参照がオブジェクトのインスタンスに設定されていません。" Source="NC3A.SI.Rowlex" StackTrace: NC3A.SI.Rowlex.RdfPropertyAttribute.ExtractRange(MemberInfo memberInfo、Int32& minCardinality、Int32& maxCardinality) で NC3A.SI.Rowlex.RdfPropertyAttribute.ExtractRange(MemberInfo memberInfo) at NC3A.SI. Rowlex.Rdfizer.AppendProperty(RdfDocument doc, MemberInfo memberInfo, RdfPropertyAttribute attribute, Object item, String resourceUri) at NC3A.SI.Rowlex.Rdfizer.AppendSingleRdfSerializableObject(RdfDocument doc, Object item) at NC3A.SI.Rowlex.Rdfizer.ProcessItem(RdfDocument) doc、Object item、String[] rangeTypeUris) を NC3A.SI.Rowlex.Rdfizer.

4

1 に答える 1

2

あなたがしたことは問題ないように見えますが、エラーが 1 つあります。MyTestProp はデータ型プロパティではなくオブジェクト プロパティであるため、RdfProperty 宣言は MyTestProp に対して "false" を取る必要があります (リテラルではなくオブジェクトを返します)。

ただし、これが問題の原因であるかどうかはわかりません。たとえそうであっても、愚かな NullReferenceException ではなく、意味のあるテキストを含む適切なエラー メッセージが表示されるはずです。したがって、エラーを再現し、該当する場合は修正を提供したいと思います。具体的に教えてください

  • MyTestProp をホストするクラスとその装飾、
  • そのクラスをインスタンス化するコード、および
  • シリアル化に使用するコード。
  • アセンブリ レベルの属性 (オントロジー - 名前空間マッピング用) を適用した場合は、それも示してください。

[admin at rowlex.net] にあなたのコード サンプルを送ることを検討していただけないでしょうか。

編集: 例外を再現できました。これは ROWLEX のバグです。修正済みの 2.0.1 バージョンをROWLEXサイトからダウンロードできるようになりました。

于 2009-07-14T06:57:54.490 に答える