Is there any way to serialize a property with an internal setter in C#?
I understand that this might be problematic - but if there is a way - I would like to know.
Example:
[Serializable] public class Person { public int ID { get; internal set; } public string Name { get; set; } public int Age { get; set; } }
Code that serializes an instance of the class Person:
Person person = new Person(); person.Age = 27; person.Name = "Patrik"; person.ID = 1; XmlSerializer serializer = new XmlSerializer(typeof(Person)); TextWriter writer = new StreamWriter(@"c:\test.xml"); serializer.Serialize(writer, person); writer.Close();
Result (missing the ID property):
<?xml version="1.0" encoding="utf-8"?> <Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <Name>Patrik</Name> <Age>27</Age> </Person>
Uses for serializationSending the object to a remote application by using a web service. Passing an object from one domain to another. Passing an object through a firewall as a JSON or XML string. Maintaining security or user-specific information across applications.
In Java, serialization is a concept using which we can write the state of an object into a byte stream so that we can transfer it over the network (using technologies like JPA and RMI). But, static variables belong to class therefore, you cannot serialize static variables in Java.
Only collections are serialized, not public properties.
List is not but implementation classes like ArrayLists are serializable. You can use them.
If it is an option, DataContractSerializer
(.NET 3.0) can serialize non-public properties:
[DataContract] public class Person { [DataMember] public int ID { get; internal set; } [DataMember] public string Name { get; set; } [DataMember] public int Age { get; set; } } ... static void Main() { Person person = new Person(); person.Age = 27; person.Name = "Patrik"; person.ID = 1; DataContractSerializer serializer = new DataContractSerializer(typeof(Person)); XmlWriter writer = XmlWriter.Create(@"c:\test.xml"); serializer.WriteObject(writer, person); writer.Close(); }
With the xml (re-formatted):
<?xml version="1.0" encoding="utf-8"?> <Person xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/"> <Age>27</Age> <ID>1</ID> <Name>Patrik</Name> </Person>
You can implement IXmlSerializable, unfortunately this negates the most important benefit of XmlSerializer (the ability to declaratively control serialization). DataContractSerializer (xml based) and BinaryFormatter (binary based) could be used as alternatives to XmlSerializer each having its pros and cons.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With