मैं एक ProtoException
मिल ("संभावित प्रत्यावर्तन का पता चला (ऑफसेट: 4 स्तर (रों)): ओ ईओडब्ल्यू") जब इतनी तरह एक वृक्ष संरचना serializing:को क्रमानुसार उपसर्ग पेड़
var tree = new PrefixTree();
tree.Add("racket".ToCharArray());
tree.Add("rambo".ToCharArray());
using (var stream = File.Open("test.prefix", FileMode.Create))
{
Serializer.Serialize(stream, tree);
}
पेड़ कार्यान्वयन:
[ProtoContract]
public class PrefixTree
{
public PrefixTree()
{
_nodes = new Dictionary<char, PrefixTree>();
}
public PrefixTree(char[] chars, PrefixTree parent)
{
if (chars == null) throw new ArgumentNullException("chars");
if (parent == null) throw new ArgumentNullException("parent");
if (chars.Length == 0) throw new ArgumentException();
_parent = parent;
_nodes = new Dictionary<char, PrefixTree>();
_value = chars[0];
var overflow = chars.SubSet(1);
if (!overflow.Any()) _endOfWord = true;
else Add(overflow.ToArray());
}
[ProtoMember(1)]
private readonly char _value;
[ProtoMember(2)]
private readonly bool _endOfWord;
[ProtoMember(3)]
private readonly IDictionary<char, PrefixTree> _nodes;
[ProtoMember(4, AsReference = true)]
private readonly PrefixTree _parent;
public void Add(char[] word)
{
if (word == null) throw new ArgumentNullException("word");
if (word.Length == 0) return;
var character = word[0];
PrefixTree node;
if (_nodes.TryGetValue(character, out node))
{
node.Add(word.SubSet(1));
}
else
{
node = new PrefixTree(word, this);
_nodes.Add(character, node);
}
}
public override string ToString()
{
return _endOfWord ? _value + " EOW" : _value.ToString();
}
}
public static class ListHelper
{
public static char[] SubSet(this char[] source, int start)
{
return source.SubSet(start, source.Length - start);
}
public static char[] SubSet(this char[] source, int start, int length)
{
if (start < 0) throw new ArgumentOutOfRangeException();
if (start > source.Length) throw new ArgumentOutOfRangeException();
if (length < 0) throw new ArgumentOutOfRangeException();
var result = new char[length];
Array.Copy(source, start, result, 0, length);
return result;
}
}
क्या मैं गलत विशेषताओं से सजा रहा हूं या क्या मैंने बस एक गैर-धारावाहिक पेड़ तैयार किया है?
संपादित करें: कोई लाभ नहीं हुआ इस की कोशिश की:
var typeModel = RuntimeTypeModel.Default;
var type = typeModel.Add(typeof(PrefixTree), false);
type.AsReferenceDefault = true;
type.Add("_value", "_endOfWord", "_nodes", "_parent");
var tree = new PrefixTree();
tree.Add("racket".ToCharArray());
tree.Add("rambo".ToCharArray());
using (var stream = File.Open("test.prefix", FileMode.Create))
{
typeModel.Serialize(stream, tree);
}
आपकी 'सबसेट' एक्सटेंशन विधि क्या है? एक कामकाजी repro पाने के लिए समझने की जरूरत है। इसके अलावा, 'ऐड' विधि क्या है? –
हालांकि! यहां मुख्य समस्या यह है कि "शब्दकोश" हैंडलर डिफ़ॉल्ट रूप से संदर्भ-प्रकार का उपयोग नहीं करता है। यदि मैं एक कामकाजी रेपो प्राप्त कर सकता हूं तो मैं और अधिक देखने में सक्षम हो सकता हूं। –
संपादन को पुन: संपादित करें, अभी भी "त्रुटि विधि के लिए कोई अधिभार नहीं है 'सबसेट' 2 तर्क लेता है" - ListHelper.SubSet विधि –