मैं BinaryFormatter
के साथ एक DynamicObject
वर्ग क्रमानुसार करने की कोशिश की है, लेकिन:गतिशील वस्तु क्रमबद्धता
- आउटपुट फ़ाइल बहुत बड़ी है, बिल्कुल नहीं तार के अनुकूल है
- परिपत्र संदर्भ नहीं संभाला (जबकि serializing अटक)
के बाद से serializing एक DynamicObject
अपने आप में बहुत कम मतलब है, यहाँ वर्ग मैं क्रमानुसार करने की कोशिश की है:
[Serializable()]
class Entity
: DynamicObject, ISerializable
{
IDictionary<string, object> values = new Dictionary<string, object>();
public Entity()
{
}
protected Entity(SerializationInfo info, StreamingContext ctx)
{
string fieldName = string.Empty;
object fieldValue = null;
foreach (var field in info)
{
fieldName = field.Name;
fieldValue = field.Value;
if (string.IsNullOrWhiteSpace(fieldName))
continue;
if (fieldValue == null)
continue;
this.values.Add(fieldName, fieldValue);
}
}
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
this.values.TryGetValue(binder.Name, out result);
return true;
}
public override bool TrySetMember(SetMemberBinder binder, object value)
{
this.values[binder.Name] = value;
return true;
}
void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
{
foreach (var kvp in this.values)
{
info.AddValue(kvp.Key, kvp.Value);
}
}
}
(मुझे लगता है मैं एक ExpandoObject का इस्तेमाल किया है सकते हैं, लेकिन है कि एक और कहानी है लगता है।)
यहाँ एक सरल परीक्षण कार्यक्रम है: मदद मुझे एक नजर है
static void Main(string[] args)
{
BinaryFormatter binFmt = new BinaryFormatter();
dynamic obj = new Entity();
dynamic subObj = new Entity();
dynamic obj2 = null;
obj.Value = 100;
obj.Dictionary = new Dictionary<string, int>() { { "la la la", 1000 } };
subObj.Value = 200;
subObj.Name = "SubObject";
obj.Child = subObj;
using (var stream = new FileStream("test.txt", FileMode.OpenOrCreate))
{
binFmt.Serialize(stream, obj);
}
using (var stream = new FileStream("test.txt", FileMode.Open))
{
try
{
obj2 = binFmt.Deserialize(stream);
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
Console.ReadLine();
}
कुछ breakpoints यहाँ लाना और वहाँ obj2 सामग्री पर और ऐसा लगता है कि मूल डेटा सही ढंग से deserialized है, हालांकि उपरोक्त कमियों के साथ अगर आप कल्पनाशील हो और डेटा चारों ओर ले जाएँ।
मैंने मार्क ग्रेवेल के प्रोटोबफ-नेट पर एक नज़र डाली थी, लेकिन मुझे वास्तव में इस तरह के संदर्भ में इसका उपयोग करने का यकीन नहीं है (मुझे यह भी यकीन नहीं है कि मैंने रिपोजिटरी से सही संस्करण उठाया है, लेकिन हे) ।
मुझे पता है कि यह शब्दों की तुलना में अधिक कोड है, लेकिन मुझे नहीं लगता कि मैं परिदृश्य को किसी भी बेहतर तरीके से समझा सकता हूं। कृपया यह बताएं कि क्या इस प्रश्न को स्पष्ट करने के लिए मैं कुछ जोड़ सकता हूं।
किसी भी मदद की बहुत सराहना की जाती है।
संदर्भ के लिए, * Protobuf शुद्ध * वर्तमान के लिए कोई समर्थन नहीं है 'dynamic'। मैं serialization के लिए एक डीटीओ परत में जाने का सुझाव देना होगा। –
@Marc - धन्यवाद, मैं उसमें देख लूंगा। अभी भी अन्य सुझावों के लिए भी खुला है। – Raine
अच्छी तरह से, दीर्घकालिक यह कुछ है जो मैं प्रोटोबफ-नेट में समर्थन करने की योजना बना रहा हूं। लेकिन मैं इस समय कुछ भी वादा नहीं कर सकता। –