UDP Пакет Сериализация и снятие накладных расходов - PullRequest
0 голосов
/ 22 августа 2011

Я собираюсь сериализовать пакет с информацией, которая действует как ответ на входящий пакет udp. Входящий пакет UDP очень компактен и содержит именно ту информацию, которую я хочу видеть.

Когда я отправляю свой ответ, пакет становится почти в 200 раз больше (1036 байт против 57 байт ..) и содержит много пробелов, имя экземпляра класса и его структуру (например, обнуляемый и т. Д.).

Вопрос может звучать широко, но в чем здесь проблема? Я понимаю, что моим решением является сериализация всего объекта, включая его имя класса, пространство имен и так далее. Получатель не нуждается, не будет и не может принять эту информацию. Им нужно перейти непосредственно в структуру данных.

Ответы [ 2 ]

1 голос
/ 23 августа 2011

Возможно, вам стоит попробовать Protobuf .Он поддерживает атрибутивную модель сериализации (фактически он поддерживает несколько атрибутивных моделей, включая модель DataContract WCF) и значительно быстрее встроенной двоичной сериализации .Net (даже быстрее, чем сериализация DataContract).Protobuf также спроектирован как можно более компактным, поэтому у вас должно быть меньше проблем с размером пакета.

Редактировать: Вы также можете реализовать собственную парадигму сериализации, используя интерфейс.Например:

public interface IBinarySerializable
{
    void Serialize(BinaryWriter writer);
    void Deserialize(BinaryReader reader);
}

public static class BinaryReaderWriterExtensions
{
    public static void Write(this BinaryWriter writer, IBinarySerializable value)
    {
        value.Serialize(writer);
    }

    public static T Read<T>(this BinaryReader reader)
        where T : IBinarySerializable, new()
    {
        var val = new T();
        val.Deserialize(reader);
        return val;
    }

    public static void ReadInto(this BinaryReader reader, IBinarySerializable value)
    {
        value.Deserialize(reader);
    }

    public static void WriteList<T>(this BinaryWriter writer, IList<T> list, Action<BinaryWriter, T> singleValueWriter)
    {
        writer.Write(list.Count);
        foreach (var item in list)
            singleValueWriter(writer, item);
    }

    public static IEnumerable<T> ReadList<T>(this BinaryReader reader, Func<BinaryReader, T> singleValueReader)
    {
        var ct = reader.ReadInt32();
        for (var i = 0; i < ct; i++)
            yield return singleValueReader(reader);
    }
}

public class WantsToBeSerialized : IBinarySerializable
{
    public int ID;
    public string CustomerName;
    public List<string> Nicknames;
    public SomeOtherSerializableObject Thing;

    void IBinarySerializable.Serialize(BinaryWriter writer)
    {
        writer.Write(ID);
        writer.Write(CustomerName);
        writer.WriteList(Nicknames, (w, value) => w.Write(value));
        writer.Write(Thing);
    }

    void IBinarySerializable.Deserialize(BinaryReader reader)
    {
        ID = reader.ReadInt32();
        CustomerName = reader.ReadString();
        Nicknames = new List<string>(reader.ReadList(x => x.ReadString()));
        Thing = reader.Read<SomeOtherSerializableObject>();
    }
}
0 голосов
/ 22 августа 2011

Проблема здесь в том, что ваш коллега ожидает плоскую, похожую на xml структуру, которая может выглядеть как XML, но не соответствует действительности или корректна в соответствии со спецификациями xml.

Вы можете настроить .netсериализаторы (DataContract или XMLSerializer), если вы помните, что то, что вы выводите, может быть недействительным или корректным.Проверьте следующие две ссылки, они должны указывать вас в правильном направлении.

РЕДАКТИРОВАТЬ: Добавлено двоичное форматирование с использованием XMLSerializer, не уверен насчет вашего формата вывода, но, возможно, это поможет.

class Program
{
    static void Main(string[] args)
    {
        TestObject data = new TestObject() { Name = "Claus", Firstname = "Santa"};

        MemoryStream stream = new MemoryStream();

        XmlSerializerNamespaces xsn = new XmlSerializerNamespaces();
        xsn.Add(String.Empty, String.Empty);

        XmlSerializer serializer = new XmlSerializer(typeof(TestObject));

        XmlDictionaryWriter binaryDictionaryWriter = XmlDictionaryWriter.CreateBinaryWriter(stream);

        serializer.Serialize(binaryDictionaryWriter, data,xsn);

        binaryDictionaryWriter.Flush();

        stream.Seek(0, SeekOrigin.Begin);

        StreamReader reader = new StreamReader(stream);

        string s = reader.ReadToEnd();
    }
}

[Serializable()]
public class TestObject
{
    [XmlAttribute]
    public string Name { get; set; }

    [XmlIgnore]
    public string Firstname { get; set; }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...