Utilizzando Rdf proprietà di matrice per classe personalizzata
Domanda
Ho definito:
[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" } };
}
}
Quando si tenta di serializzare la classe che contiene questa usanza "MyTestProp" e mi ha dato quel messaggio:
Il riferimento non impostato a un istanza di un oggetto.
Descrizione: un'eccezione non gestita durante l'esecuzione del richiesta Web corrente. Si prega di rivedere la Analisi dello stack per ulteriori informazioni su l'errore e dove ha avuto origine in il codice.
Dettagli eccezione: System.NullReferenceException: Oggetto riferimento non impostato a un'istanza di un oggetto.
Mi sbaglio nel definire tali proprietà o c'è un modo speciale per definire array per classe personalizzata? Si noti che la serializzazione array stringa per esempio, non mi si blocca in quel modo, ma si sta lavorando.
Tutta la fonte:
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());
}
}
}
L'eccezione è:
System.NullReferenceException era Messaggio gestita = "Oggetto non impostato a un'istanza di un oggetto." Source = StackTrace "NC3A.SI.Rowlex": a NC3A.SI.Rowlex.RdfPropertyAttribute.ExtractRange (MemberInfo MemberInfo, Int32 & minCardinality, Int32 & maxCardinality) a NC3A.SI.Rowlex.RdfPropertyAttribute.ExtractRange (MemberInfo MemberInfo) a NC3A.SI.Rowlex.Rdfizer.AppendProperty (RdfDocument doc, MemberInfo MemberInfo, attributo RdfPropertyAttribute, Object oggetto, String ResourceURI) a NC3A.SI.Rowlex.Rdfizer.AppendSingleRdfSerializableObject (RdfDocument doc, oggetto Object) a NC3A.SI.Rowlex.Rdfizer.ProcessItem (RdfDocument doc, oggetto oggetto, String [] rangeTypeUris) a NC3A.SI.Rowlex.Rdfizer.ExecuteSerialization (IEnumerable oggetti) a NC3A.SI.Rowlex.Rdfizer.Serialize (IEnumerable oggetti, booleano tolerateUnserializebleObjects) a NC3A.SI.Rowlex.Rdfizer.Serialize (Object articolo) a ROWLEXtest1.Program.Main (String [] args) in C: \ ROWLEXtest1 \ ROWLEXtest1 \ Program.cs: linea 40 a System.AppDomain._nExecuteAssembly (Assemblea montaggio, String [] args) a Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly () a System.Threading.ExecutionContext.Run (ExecutionContext ExecutionContext, ContextCallback callback, Object state) a System.Threading.ThreadHelper.ThreadStart () InnerException:
Soluzione
Quello che hai fatto sembra OK ma c'è un errore: Dichiarazione RdfProperty dovrebbe prendere "false" per MyTestProp come MyTestProp non è una proprietà tipo di dati, ma proprietà di un oggetto (restituisce oggetti e non letterali).
Tuttavia, non sono sicuro che questa è la radice del problema. E anche se lo fosse, si dovrebbe ottenere un messaggio di errore decente con testo significativo, invece di sciocco NullReferenceException . Pertanto, vorrei tentare di riprodurre il vostro errore e di fornire una correzione, se applicabile. La prego, specificare
- la classe e la sua decorazione che ospita il MyTestProp,
- del codice in cui si crea un'istanza di quella classe, e
- il codice che si utilizza per per la serializzazione.
- Se aveste applicare gli attributi a livello di montaggio (per l'ontologia - la mappatura dello spazio dei nomi), si prega di indicare anche quello.
Forse si potrebbe prendere in considerazione l'invio di me il tuo esempio di codice a [admin a rowlex.net].
EDIT: Potrei riprodurre l'eccezione, si tratta di un bug in ROWLEX. Il 2.0.1 versione fissa ora può scaricare dal ROWLEX sito.