में एक अंतरिक्ष परिणाम के साथ एक फ्लैग किए गए enum डी-serializing जब डी-serializing एक फ्लैग किए गए enum है कि एक जगह एक SerializationException फेंक दिया जाता है जिसमें एक मूल्य के साथ एक EnumMemberAttribute साथ सजाया गया है। मूल्य में स्थान को विभाजक के रूप में माना जाता है।SerializationException
वहाँ विभाजक बदलने के लिए या उद्धरण में मूल्यों डाल करने के लिए कोई तरीका है? या यहां तक कि एक और आसान समाधान है?
विकल्प मैं पहले से ही विचार कर रहा हैं:
- इस enum प्रकार
- अंडरस्कोर से रिक्त स्थान की जगह की सूची के साथ चिह्नित enum की जगह
- यह एक WCF सेवा में प्रयोग किया जाता है, और मैं पता है कि कुछ लोगों द्वारा datacontracts में enums एक बुरी बात पर विचार कर रहे हैं। तो मैं भी enum को सभी को खोने के बारे में सोच रहा हूं।
लेकिन मुझे सच में लगता है कि यह कुछ कॉन्फ़िगर करने योग्य या कुछ अन्य लोगों को पहले से हल किया जाना चाहिए। लेकिन मुझे कुछ भी नहीं मिला।
मैं एक साधारण इकाई परीक्षण करने के लिए नीचे समस्या उबला हुआ है। में परिणाम नीचे कोड:
संदेश = अमान्य enum मान 'टेस्ट' प्रकार 'UnitTests.TestEnum' में deserialized नहीं किया जा सकता। सुनिश्चित करें कि आवश्यक enum मान मौजूद हैं और यदि प्रकार DataContractAttribute विशेषता है EnumMemberAttribute विशेषता के साथ चिह्नित हैं। स्रोत = System.Runtime.Serialization
using System;
using System.IO;
using System.Runtime.Serialization;
using System.Xml;
using FluentAssertions;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace UnitTests
{
[TestClass]
public class EnumSerizalizationTests
{
[TestMethod]
public void SerializingAndDesrializingAFlaggedEnumShouldResultInSameEnumValues()
{
//Arrange
var orgObject = new TestClass { Value = TestEnum.TestValue1 | TestEnum.TestValue2 };
//Act
var temp = DataContractSerializeObject(orgObject);
var newObject = DataContractDeSerializeObject<TestClass>(temp);
//Assert
newObject.ShouldBeEquivalentTo(orgObject, "Roundtripping serialization should result in same value");
}
public string DataContractSerializeObject<T>(T objectToSerialize)
{
using (var output = new StringWriter())
{
using (var writer = new XmlTextWriter(output) {Formatting = Formatting.Indented})
{
new DataContractSerializer(typeof (T)).WriteObject(writer, objectToSerialize);
return output.GetStringBuilder().ToString();
}
}
}
public T DataContractDeSerializeObject<T>(string stringToDeSerialize)
{
DataContractSerializer ser = new DataContractSerializer(typeof(T));
T result;
using (StringReader stringReader = new StringReader(stringToDeSerialize))
{
using (XmlReader xmlReader = XmlReader.Create(stringReader))
{
result = (T)ser.ReadObject(xmlReader);
}
}
return result;
}
}
[DataContract]
[KnownType(typeof(TestEnum))]
public class TestClass
{
[DataMember]
public TestEnum Value { get; set; }
}
[Flags]
[DataContract]
public enum TestEnum
{
[EnumMember(Value = "Test value one")]
TestValue1 = 1,
[EnumMember(Value = "Test value two")]
TestValue2 = 2,
[EnumMember]
TestValue3 = 4,
[EnumMember]
TestValue4 = 8,
}
}
मैं यह नहीं कहूंगा कि "डेटाकंट्रैक्ट्स में enums एक बुरी चीज है" लेकिन मेरे लिए "enums में रिक्त स्थान का उपयोग करना एक बुरी चीज है" ;-) – fixagon
सहमत है :) मुझे कहीं भी रिक्त स्थान पसंद नहीं हैं, लेकिन यह मेरी पसंद नहीं है । यदि मैं आपको उन मूल्यों को दिखाऊंगा जो वास्तविक enums में जाने की आवश्यकता है तो आप रोना शुरू कर देंगे। – KeesDijk
उस पर भी देखें: http://stackoverflow.com/questions/1415140/can-my-enums-have-friendly- नाम लेकिन वास्तव में आपकी स्थिति में सहायता नहीं करता है। अन्यथा आप इंट के रूप में enum क्रमबद्ध कर सकते हैं। लेकिन यह डेटाकंट्रैक्ट – fixagon